请说明原因,并列出实现了(mis)功能的语言。
发布您认为有害的功能,而不是您不喜欢的功能。
a = 1/0
-基本表达,有害。;-)
请说明原因,并列出实现了(mis)功能的语言。
发布您认为有害的功能,而不是您不喜欢的功能。
a = 1/0
-基本表达,有害。;-)
Answers:
信息:http : //php.net/manual/zh/security.globals.php
出于可读性和安全性考虑,这是迄今为止最糟糕的功能。基本上所有收到的GET参数都转换为变量。
例如,使用以下URL:/index.php?value=foobar
您可以执行以下操作:
<?php
echo $value; // return foobar
?>
当您阅读代码时,知道变量的来源非常令人困惑。
另外,如果滥用该功能,可能会导致安全漏洞。这是来自php.net的代码示例,展示了如何滥用它:
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
默认情况下允许Null,即“万亿” *美元的错误。抱歉,托尼·霍尔。星球上几乎所有可用的语言。
*我调整了托尼·霍尔(Tony Hoare)创造的表达方式,以反映这几天的实际损失:-)
C和C ++宏。如果由于有人为宏选择了标准函数名称而使我的代码搞砸了,而我又不得不看到另一个编译器错误,我将大声疾呼。让我们看看最后一个令人讨厌的地方:
#define vector(int) new VARIANT[int];
啊!您对我的STL向量做了什么!?
当隐式类型转换之间没有明显的关系时。例如,将类似PHP 的随机非数字string
转换为int
。
explicit
可以停止隐式类型转换,但是仍然存在问题。
0
获取某个值要好。
没有
仅因为频繁使用某个功能并不会造成危害。
恕我直言,整个“被认为是有害的”是编程语言讨论的还原。
大多数(即使不是全部)“有害”功能都具有或最初具有非常有效的用例,或者首先只是方便的方法。开发人员需要了解其优缺点并相应地进行编码。
如果您的问题是按照“哪些语言功能具有常见的陷阱或不幸的副作用”来解决的,那么我的答案将有所不同。
[编辑]要明确:我并不是说继续使用不赞成使用的方法。如果开发人员要折旧/删除功能,则应使用替换功能。我指的是该语言的当前部分被认为是有害的,因为有些人不喜欢它所鼓励的内容或许多人讨论过的使用它所涉及的取舍。
PLEASE
在INTERCAL中。它抱怨说,没有足够使用它。抱怨太多。
尽管有些人不同意这个人或他所说的各种说法,但很多道格拉斯·克罗克福德(Douglas Crockford)的JavaScript:The Good Parts基本上就是这个问题,适用于JS。在克罗克福德的抱怨中:
默认情况下,所有内容都具有全局作用域(DC展示了如何将函数/对象用作名称空间和作用域定界符,以解决此问题。)
诸如之类的语句with
,其失败行为是在全局命名空间中定义事物。(Gah!就像JS座右铭一样,如果您失败了,那么就尽可能失败!)
==
操作员的意外行为,这基本上要求您始终使用===
操作员。
分号插入。
实际上,很多JS应该被认为是有害的,甚至是整个语言也应该被认为是有害的,但是好的部分实在是太好了,以至于弥补了它(至少对我而言)。
好的,这并不是语言本身的功能,但仍然紧密相关。
突然,您的Flash / Flex应用程序停止运行,没有人能给您丝毫提示f *发生了什么。没有错误信息,没有堆栈跟踪,什么都没有。只是突然之间就不会发生屏幕转换(或完全错误地发生),或者按钮不再对单击做出反应,或者组合框为空,而不是填充了某些条目。
单单是“功能”就引起了许多耸耸肩的报道以及我得到的一堆白发。-.-虽然也不希望在用户脸上弹出一些隐秘消息,但这至少可以帮助开发人员解决问题。
但是Flash Player会依靠用户的描述让您在黑暗中st刀(而问题实际上可能源自代码中完全不同的位置,与用户的操作没有任何关系)。仅当您使用调试播放器时,您实际上会获得带有错误消息和堆栈跟踪的弹出窗口。
但是,在某些新闻站点上观看嵌入的Flash电影并从使用的嵌入播放器SWF中获得有关Null引用的重复消息可能会非常有趣。:D
在C / C ++中:这些赋值也是与非常相似的assign =和compare ==运算符组合的表达式。本身并不是有害的功能,但是它是通过不小心误操作员而易于引入(有时是细微的)错误的方法。
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
可以逆时针旋转LOGO。WTF,让我们顺时针旋转360 - x
角度。
PHP中的变量变量
只是因为你$can
并不意味着你$$should
use strict
),并有一种在特定情况下再次将其重新开启的简便方法(no strict 'refs'
)。
我With
想到了Delphi中的声明,尽管在某些情况下它很有用。
AWK中的数组从索引1开始!
car
!:P
在Perl中,标量上下文与列表上下文比较棘手。它有一些使某些操作变得方便的优点,但是有时您会遇到一些可怕的事情,例如完全改变运算符的含义(可能在代码中很远的距离)。
sub foo { (1..5) }
my @list = foo(); # (1,2,3,4,5)
my $length = scalar @list; # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)
那是不对的。
(它源于试图使行为类似于常规范围运算符的行为,因此您可以像那样在循环中说出一些东西next if /start_regex/ .. /end_regex/
)。
Python 2.x的相对导入语法。假设我有一个软件包x.plugins
,该软件包增加了对的其他各种库的支持x
。并假设我有一个sqlalchemy
模块,x.plugins
以便可以向中添加sqlalchemy支持x
。如果将以下行添加到sqlalchemy.py,您会怎么办?
import sqlalchemy
答案是该模块将尝试自行导入。这种语法的作用实际上是使不可能导入实际的全局sqlalchemy包。Python 2.5添加了一种指定这是相对导入的方式:
from . import sqlalchemy
...但是直到Python 3才真正摆脱了第一种语法(尽管可以使用禁用Python 2.6+中的语法from __future__ import absolute_import
)。
我一直都喜欢sun.misc.unsafe;“我们需要用它来实现事物,但实际上,真的不认为您应该使用它。”
面向对象(来自所有静态类型的语言)。我敢打赌,这个功能已经并将继续,成本大大超过空指针。面向对象仅在动态消息传递语言中才有用。因此,它也应该从诸如Python的动态语言中删除(因为它不使用消息传递,而是使用常规的子例程调用)。
没有经验的开发人员要么依赖于启用它,然后假定所有用户输入都被转义以用于SQL查询,要么依赖于其被禁用,因此始终转义其输入。
假设已启用它,然后在未安装它的系统上运行代码,则会打开巨大的SQL注入孔。
假设已禁用(而不是禁用),则会导致反斜杠实际存储在数据库中,从而导致字符串难看/不正确。
也没有一种非常简单的方法来处理这两种情况-您需要检查是否已启用使用get_magic_quotes_gpc()
,然后将其应用于数组中的stripslashes()
所有值$_*
-由于array_map
这不是递归的,因此您需要一个自定义函数。
我不得不说垃圾收集。它并没有消除对内存管理的思考,而是消除了对内存管理的思考的感觉,而内存管理常常会消除实际的想法,从而导致大量的资源消耗,并且不知道为什么。尤其是当可以将现代世代GC的行为描述为没有过多夸张的情况时,无论如何都是“设计导致的一次大内存泄漏”。
C,当然还有C ++:指针算术。允许人们将整数转换为内存地址会带来麻烦。
甚至完全可以完全原始访问指针?
在C ++中,您具有使指针几乎完全不必要的引用。对于其余情况,应将智能指针视为强制性的。
Java还证明,您可以制作一种使用指针的编程语言,而无需允许人们访问指针值本身。
除了null
...,那是一个不同的故事。
for(int i=0;i<SIZE;++i) ++arr[i]
比慢for(int*i=arr;i<arr+SIZE;++i)*i++
。所有Java设法证明您确实需要指针,还是您从未看过sun.misc.Unsafe
?如果不需要指针,请说明如何使用Java编写通用交换函数。(例如int a = 1,b = 2; swap(a,b); assert(a == 2 && b == 1);)。更不用说如果您不得不使用引用,则会在c / c ++中遇到所有问题。您如何在不带指针的不透明结构上调用虚拟函数?