Пожалуйста, объясните, почему и перечислите, на каких языках реализована (неправильная) функция Насколько вы знаете.
Публикуйте то, что вы считаете вредной особенностью, а не то, что вам не нравится.
a = 1/0
- основное выражение, вредно. ;-)
Пожалуйста, объясните, почему и перечислите, на каких языках реализована (неправильная) функция Насколько вы знаете.
Публикуйте то, что вы считаете вредной особенностью, а не то, что вам не нравится.
a = 1/0
- основное выражение, вредно. ;-)
Ответы:
Информация: http://php.net/manual/en/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 по умолчанию, ошибка «триллион» * доллар. Извини, Тони Хоар. Почти все языки доступны на планете.
* Я скорректировал выражение, придуманное Тони Хоаром, чтобы отразить фактические потери в эти дни :-)
C и C ++ MACROS. Если мне когда-нибудь придется увидеть еще одну ошибку компилятора из-за того, что кто-то выберет стандартное имя функции для своего макроса, которое испортит мой код, я буду кричать. Давайте посмотрим на последний обидчик:
#define vector(int) new VARIANT[int];
Aaarg! Что вы сделали с моим вектором STL !?
Прохождение по умолчанию в операторах переключения C и C ++.
break
заявление или кто-то не добавит дело между двумя делами (или не переупорядочит их), не заметив, что между ними произошел сбой . Я не вижу способа, чтобы это было лучше, чем способ C #, требующий либо перерыва, либо перехода к делу, и т. Д.
Неявные преобразования типов, когда типы, между которыми выполняется преобразование, не имеют очевидной связи. Например, преобразование случайного, не числового string
в int
, как в PHP.
explicit
, которое останавливает неявные преобразования типов, но все еще есть проблемы.
0
значение для некоторого значения.
goto : хотя в редких случаях все в порядке, его чаще всего неправильно используют, что приводит к затруднению чтения программ.
НИКТО
Тот факт, что функция часто используется неправильно, не делает ее вредной.
ИМХО все "считается вредным" - это Reductio ad Hitlerum дискуссий о языке программирования.
Большинство, если не все, «вредных» функций имеют или имели изначально очень приемлемый вариант использования или, во-первых, являются просто удобными методами. Это зависит от разработчиков, чтобы понять плюсы и минусы и код соответственно.
Если бы ваши вопросы должны были быть чем-то вроде «какие языковые особенности имеют общие подводные камни или нежелательные побочные эффекты», мой ответ был бы другим.
[править] Чтобы быть ясным: я не имею в виду дальнейшее использование устаревших методов. Если разработчики осуждают / удаляют функцию, вы должны использовать замену. Я имею в виду концепцию о том, что текущая часть языка считается вредной, поскольку некоторым не нравится то, что он поощряет, или компромисс, связанный с его использованием, который обсуждают многие.
Автовивификация (или другая функция bind-variable-on- (assign | use)) - это функция, которая, как я обнаружил, дает мне больше ошибок.
PLEASE
в INTERCAL. Не используйте это достаточно, это жалуется. Используйте это слишком много, это жалуется.
Хотя некоторые люди не согласны с человеком или различными вещами, которые он говорит, большая часть JavaScript Дугласа Крокфорда : «Хорошие части» в основном относится к JS. Среди жалоб Крокфорда:
Глобальная область видимости по умолчанию для всего (DC показывает, как использовать функцию / объекты в качестве пространств имен и разделителей области действия, чтобы разрешить это.)
Утверждения типа with
, чье поведение отказа состоит в том, чтобы определять вещи в глобальном пространстве имен. (Гах! Это как девиз JS: если ты провалишься, то провалишься как можно сильнее !)
Неожиданное поведение с ==
оператором, которое в основном требует от вас всегда использовать ===
оператора.
Точка с запятой.
На самом деле весь JS следует считать вредным, может быть, даже весь язык, но хорошие части настолько чертовски хороши, что это как бы компенсирует это (по крайней мере, для меня).
Хорошо, не совсем особенность самого языка, но все же довольно тесно связанная.
Внезапно ваше приложение Flash / Flex перестает работать, и никто не может дать вам ни малейшего намека на то, что произошло *. Нет сообщения об ошибке, нет трассировки стека, нет ничего. Просто внезапно переход экрана не происходит (или происходит совершенно неправильно), или кнопки больше не реагируют на нажатия, или комбинированные списки пусты вместо того, чтобы заполняться какими-то записями.
Одна эта «особенность» ответственна за несколько сообщений о пожимании плечами и целую кучу седых волос, которые я получаю. -.- Хотя появление нежелательного сообщения на лице пользователя также нежелательно, оно может, по крайней мере, помочь разработчику решить проблему.
Но Flash Player оставляет вас в темноте, полагаясь на описание пользователя (в то время как проблема может на самом деле происходить из совершенно другого места в коде, которое не имеет никакого отношения к тому, что делал пользователь). Только если вы используете Debug Player, вы получите всплывающее окно с сообщением об ошибке и трассировкой стека.
Тем не менее, может быть довольно интересно смотреть встроенные Flash-фильмы на определенных новостных сайтах и получать повторные сообщения о ссылках Null от используемого встроенного проигрывателя SWF. : D
В C / C ++: присваивания также являются выражениями, сочетающимися с очень похожими операторами присваивания = и сравнения ==. Сама по себе не вредная особенность, но это способ легко вносить (иногда скрытые) ошибки, случайно вводя оператора в заблуждение.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Доступ к модификаторам в Java с пакетом по умолчанию для частного языка и соглашения по умолчанию для частного программирования.
Замена неопределенных переменных пустой строки в оболочке без каких - либо предупреждений: rm -rf $nosuchvar/*
.
${varname:-/dev/null}
обходного пути ...
Возможность поворота против часовой стрелки в логотипе. Wtf, давайте просто повернуть по часовой стрелке 360 - x
градусов.
В Java и на другом языке вы можете остановить поток от другого произвольно, не давая времени для потока, который вы остановили, завершиться правильно. Эта способность устарела, учитывая огромное количество проблем, которые могут возникнуть практически во всех ситуациях.
Переменные Переменные в 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 - мой самый любимый; коллекция «нам нужно это для реализации вещей, но на самом деле, действительно, не думаю, что вы должны использовать это».
Фортран общие блоки. Если вы допустили простую ошибку, одна часть приложения может заглушить глобалы другой части.
FORTRAN назначил оператор goto / оператор изменения COBOL. Самомодифицирующийся код. Опасность, предупреждение, летающие спагетти монстры !!
Ориентация на объект (из всех статически типизированных языков). Держу пари, что эта функция будет стоить намного дороже, чем нулевые указатели. Ориентация на объект хороша только в динамическом языке передачи сообщений . Поэтому он должен быть удален из динамических языков, таких как Python (поскольку он не использует передачу сообщений, а вызывает обычный вызов подпрограммы).
Неопытные разработчики либо полагаются на то, что он включен, и, таким образом, предполагают, что весь пользовательский ввод будет экранирован для использования в запросе SQL, либо полагаются на то, что он отключен, и поэтому всегда избегают своего ввода.
Если предположить, что он включен, а затем запустить код в системе, где его нет, он открывает широкие дыры в SQL-инъекциях.
Если предположить, что он отключен, а это не так, это приведет к тому, что обратная косая черта будет фактически сохранена в БД, что приведет к появлению уродливых / неправильных строк.
Также нет чрезвычайно простого способа справиться с обоими случаями - вам нужно проверить, включено ли оно с помощью, get_magic_quotes_gpc()
а затем применить его stripslashes()
ко всем значениям в $_*
массивах - поскольку array_map
это не является рекурсивным, для этого вам нужна пользовательская функция.
Функция языка, которая позволяет программистам писать некомментированный или бессмысленно прокомментированный код.
выходить немного на конечности здесь - void функции. функция всегда что-то делает, следовательно, она должна либо возвращать результат, либо какую-то другую информацию о своем успехе или неудаче.
Тыкать в бейсике ...
Я бы сказал, сбор мусора. Это не устраняет необходимость думать об управлении памятью, но устраняет ощущение необходимости думать об управлении памятью, которое слишком часто исключает реальную мысль, и тогда вы получаете огромные ресурсы и не знаете, почему. Особенно, когда поведение современных 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); подтвердить (a == 2 && b == 1);). Не говоря уже о всех проблемах в c / c ++, которые у вас возникли бы, если бы вам пришлось использовать ссылки. Как бы вы вызвали виртуальную функцию для непрозрачной структуры без указателей?