Вопрос

Пожалуйста, объясните, почему и перечислите, на каких языках реализована функция (mis), насколько вам известно.

Публикуйте то, что вы считаете вредным, а не то, что вам не нравится.

Это было полезно?

Решение 2

Разрешить NULL по умолчанию, «Триллион»* доллар ошибка. Извините, Тони Хоар. Почти каждый язык, доступный на планете.

Тони Хоар объясняет

*Я скорректировал выражение, придуманное Тони Хоаром, чтобы отразить фактическую потерю в эти дни :-)

Другие советы

Зарегистрировать глобалы в PHP

Информация : http://php.net/manual/en/security.globals.php

Это, безусловно, худшая функция, которая когда -либо реализована по соображениям чтения и соображениям безопасности. В основном все полученные параметры преобразуются в переменные.

Например, с этим 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";
}
?>

C и C ++ Макросы. Если мне когда -нибудь придется увидеть еще одну ошибку компилятора из -за того, что кто -то выбирает стандартное имя функции для своего макроса, который обладает моим кодом, я буду кричать. Посмотрим на последнее оскорбительное:

#define vector(int) new VARIANT[int];

Ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа Что вы сделали с моим вектором STL!?

Полезно по умолчанию в операторах коммутатора C и C ++.

Неявные преобразования типа, когда типы, преобразуемые между ними, не имеют очевидных отношений. Например, преобразование случайного, непермерного string в int, как в PHP.

перейти к: Хотя в редких случаях это нормально, это чаще используется и приводит к трудностям в чтении программ.

НИКТО

Тот факт, что функция часто используется неправильно, не делает ее вредной.

ИМХО, весь «считается вредным» - это Reductio ad gitlerum обсуждений языка программирования.

Большинство, если не все, «вредные» функции имеют или первоначально имели очень достоверный вариант использования или являются просто удобными методами. Разработчики должны понимать плюсы, минусы и код соответственно.

Если ваши вопросы должны были быть чем-то вроде «Какие языковые функции имеют общие ловушки или неудачные побочные эффекты», мой ответ был бы другим.

Редактировать] Чтобы быть ясным: я не имею в виду дальнейшее использование устаревших методов. Если разработчики обесценивают/удаляют функцию, вы должны использовать замену. Я имею в виду концепцию, что текущая часть языка считается вредной, потому что некоторым не нравится то, что он поощряет, или компромисс, связанный с его использованием, который многие люди обсуждают.

Автовификация (или другая функция привязкой-переменной on- (назначение | использование))-это функция, которую я обнаружил, чтобы дать мне наибольшее количество ошибок.

PLEASE в интеркальном. Не используйте его достаточно, он жалуется. Используйте это слишком много, это жалуется.

Хотя некоторые люди не согласны с человеком или различными вещами, которые он говорит, много Дугласа Крокфорда JavaScript: хорошие части в основном этот вопрос применяется к JS. Среди жалоб Крокфорда:

  • Глобальная область по умолчанию для всего (DC показывает, как использовать функцию/объекты в качестве пространств имен и разделителей сфера, чтобы сразить это в.)

  • Заявления, как with, чье неудачное поведение состоит в том, чтобы определить вещи в глобальном пространстве имен. (Гах! Это похоже на девиз JS, если вы потерпите неудачу, тогда терпите неудачу как можно тяжело!)

  • Неожиданное поведение с == оператор, который в основном требует от вас всегда использовать === оператор.

  • Полуколонная вставка.

Действительно много JS следует считать вредным, может быть, даже на весь язык, но хорошие части просто чертовски хороши, что это как бы компенсирует его (по крайней мере, для меня).)

"Бесшумный сбой" во Flash Player в качестве поведения по умолчанию

Хорошо, на самом деле это не особенность самого языка, но все же довольно тесно связанная.

Внезапно ваше приложение Flash / Flex перестает работать, и никто не может дать вам ни малейшего намека на то, что, черт возьми, произошло.Ни сообщения об ошибке, ни трассировки стека, ничего.Просто внезапно переход на экран не происходит (или происходит совершенно неправильным образом), или кнопки больше не реагируют на нажатия, или выпадающие списки пусты вместо того, чтобы быть заполненными некоторыми записями.

Одна только эта "особенность" отвечает за несколько отчеты о пожатии плечами и у меня появилась целая копна седых волос.-.- Хотя появление какого-то загадочного сообщения перед лицом пользователя также нежелательно, это, по крайней мере, может помочь разработчику устранить проблему.

Но Flash Player оставляет вас блуждать в темноте, полагаясь на описание пользователя (в то время как проблема на самом деле может возникать из совершенно другого места в коде, которое не имеет никакого отношения к тому, что делал пользователь).Только если вы используете проигрыватель отладки, вы на самом деле получаете всплывающее окно с сообщением об ошибке и трассировкой стека.

Однако может быть довольно интересно смотреть фильмы, встроенные во flash, на определенных новостных сайтах и получать повторяющиеся сообщения о нулевых ссылках из используемого 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/*.

Способность повернуть против часовой стрелки в логотипе. WTF, давайте просто повернем по часовой стрелке 360 - x градусы.

Остановка потока из другой потока

На Java и на другом языке вы можете остановить нить от другого, произвольно, не давая времени на поток, который вы остановились, чтобы закончить должным образом. Эта способность была устарел Учитывая огромное количество проблем, это может привести к почти всей ситуации.

Переменные переменные в PHP

Просто потому, что ты $can не значит тебя $$should

А With Заявление в Delphi приходит на ум, хотя есть случаи, когда это полезно.

Массивы в awk, начиная с индекса 1!

В 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 Common Blocks. Если вы совершили простую ошибку, одна часть приложения может заглушить глобалов другой части.

Фортран назначил оператор GOTO / оператор COBOL ALTE. Самомодирующий код. Опасность, предупреждение, летающие спагетти -монстры !!

ОБОТОРОВАЯ НАДЕЖДА (С всех статически напечатанных языков). Я буду пари на эту функцию, и буду продолжать стоимость значительно Больше, чем нулевые указатели. Объектная ориентация хороша только в динамике передача сообщения язык. Таким образом, его также следует отбросить из динамических языков, таких как Python (поскольку он не использует передачу сообщения, но обычное подпрограмму).

magic_quotes в PHP.

Неуспеваемые разработчики либо полагаются на его включение, и, таким образом, предполагают, что весь пользовательский ввод сбежал для использования в SQL -запросе, либо полагается на то, что он отключен и, таким образом, всегда избегает их ввода.

Предполагая, что он включен, а затем запустит код в системе, где он не открывает зияющие широкие отверстия для инъекций SQL.

Если предположить, что это отключено, а это не так, это приведет к тому, что обратная черта фактически хранится в БД, что вызывает уродливые/неправильные строки.

Также нет чрезвычайно простого способа обработки обоих случаев - вам нужно проверить, включено ли он с помощью get_magic_quotes_gpc() а затем применить stripslashes() На всех ценностях в $_* массивы - с тех пор array_map не рекурсивно, вам нужна пользовательская функция для этого.

Языковая функция, которая позволяет программистам писать неуместный или бессмысленный код.

Выходя немного на конечности здесь - пустоты. Функция всегда что -то делает, следовательно, она должна либо вернуть результат, либо какую -то другую информацию о его успехе или неудаче.

Тыкаешь в базовом ...

Я должен сказать, что коллекция мусора. Это не устраняет необходимость думать об управлении памятью, но устраняет восприятие о необходимости подумать об управлении памятью, что слишком часто устраняет фактическую мысль, а затем вы получаете огромные ресурсные свиньи и не знаете, почему. Особенно когда Поведение современных поколений GCS может быть описано без слишком большого количества гипербол как «одну большую утечку памяти по дизайну».

C, и определенно C ++: Арифметика указателя. Разрешение людям преобразовать целые числа в адреса памяти требует проблем.

И, может быть, даже необработанный доступ к указателям вообще?

В C ++ у вас есть ссылки, которые делают указатели почти совершенно ненужными. Для оставшихся случаев умные указатели должны считаться обязательными.

Java также доказывает, что вы Можно Сделайте язык программирования, который использует указатели, не позволяя людям получить доступ к самому значению указателя.

Кроме null ... но это другая история.

Лицензировано под: CC-BY-SA с атрибуция
scroll top