Поясніть, будь ласка, чому і перерахуйте, на яких мовах реалізована (неправильна) функція. Наскільки ви знаєте.
Опублікуйте те, що вважаєте шкідливим, а не тим, що вам не подобається.
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];
Ааарг! Що ви зробили з моїм вектором STL !?
Прорив за замовчуванням в операторах переключення C і C ++.
break
заяву, або хтось додасть справу між двома справами (або повторно їх замовить), не помічаючи, що між ними стався провал . Я не бачу жодного способу, щоб прорив був кращим, ніж спосіб C # вимагати перерви або переходу до справи тощо.
Неявні перетворення типів, коли типи, що перетворюються між ними, не мають явного зв'язку. Наприклад, перетворення випадкового, нечислового string
в int
, як у PHP.
explicit
, яке зупиняє конверсії неявного типу, але проблеми все ще є.
0
отримання деякого значення.
goto : хоча нормально у рідкісних випадках, його частіше застосовують та призводять до важкого читання програм.
НІКОЛИ
Тільки тому, що функція часто зловживається, не робить її шкідливою.
ІМХО весь «вважається шкідливим» - це Reductio ad Hitlerum дискусійних мов програмування.
Більшість «шкідливих» особливостей більшості, якщо не всі, мають дуже правильний випадок використання або є просто зручними методами. Розробники розуміють плюси і мінуси і кодують відповідно.
Якби ваші запитання мали на меті відповідати "які мовні особливості мають загальні підводні камені чи нещасні побічні ефекти", моя відповідь була б іншою.
[редагувати] Щоб було зрозуміло: я не маю на увазі продовження використання застарілих методів. Якщо розробники знецінюють / видаляють функцію, вам слід скористатись заміною. Я маю на увазі концепцію про те, що нинішня частина мови вважається шкідливою, оскільки деяким не подобається те, що це заохочує, або компроміс, пов'язаний з його використанням, про що багато людей обговорюють.
Автовівіфікація (або інша функція прив'язки змінної на (призначити | використання)) - це функція, яку я виявив, що дає мені найбільше помилок.
PLEASE
в INTERCAL. Не використовуйте його достатньо, він скаржиться. Використовуйте його занадто багато, він скаржиться.
Хоча деякі люди не згодні з людиною або різними речами, про які він каже, багато JavaScript Дугласа Крокфорда : хороші частини в основному це питання стосується JS. Серед скарг Крокфорда:
Глобальний діапазон за замовчуванням для всього (DC показує, як використовувати функцію / об'єкти як простори імен та роздільники діапазону, щоб це змінити.)
Висловлювання на кшталт with
, чия поведінка відмов полягає у визначенні речей у глобальному просторі імен. (Gah! Це як девіз JS, якщо ви невдачі, то невдача як можна сильніше !)
Несподівана поведінка з ==
оператором, яка в основному вимагає від вас завжди використовувати ===
оператора.
Вставка крапки з комою.
Дійсно, цілу партію JS слід вважати шкідливою, можливо, навіть цілою мовою, але хороші частини просто настільки прокляті, що це щось на зразок (принаймні, для мене).
Ок, насправді не особливість самої мови, але все ще досить тісно пов'язана.
Раптом програма Flash / Flex перестає працювати, і ніхто не може дати вам найменшого натяку на те, що сталося f *. Ні повідомлення про помилку, ні стек-трек, ні нічого. Просто так несподівано перехід екрану не відбувається (або відбувається зовсім неправильно), або кнопки більше не реагують на кліки, або комбоботи порожні, замість того, щоб заповнитись якимись записами.
Сама ця функція відповідає за кілька звітів про плечі та цілу купу сивого волосся, яке я отримую. -.- Хоча також не бажано вискакувати якесь криптичне повідомлення на обличчі користувача, воно може принаймні допомогти розробнику усунути проблему.
Але Flash Player залишає вас колоти в темряві, покладаючись на опис користувача (в той час як проблема може насправді виникати з зовсім іншого місця в коді, яке не має нічого спільного з тим, що робив користувач). Тільки якщо ви використовуєте програвач налагодження, ви фактично отримуєте спливаюче вікно із повідомленням про помилку та стек-треком.
Однак може бути досить цікавим перегляд фільмів із вбудованими фільмами на певних сайтах новин та отримання повторних повідомлень про нульові посилання від використовуваного вбудованого програвача 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}
може бути
Можливість повертати проти годинникової стрілки в LOGO. 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. Якщо ви зробили просту помилку, одна частина програми могла б обмежити глобальну частину іншої частини.
FORTRAN присвоїв goto оператор / COBOL alter оператор. Код, що змінюється самостійно. Небезпека, попередження, літаючі монстри спагетті !!
Об'єктна орієнтація (з усіх мов, які набираються статично). Я ставлю ставку на те, що ця функція буде і продовжувати коштувати набагато більше, ніж нульові покажчики. Об'єктна орієнтація хороша лише в динамічній мові передачі повідомлень . Тому його слід відмовитись від динамічних мов, таких як Python (оскільки він не використовує передачу повідомлень, а звичайний виклик підпрограми).
Недосвідчені розробники або покладаються на його ввімкнення, і, таким чином, передбачають, що весь вхід користувача буде використаний для використання в SQL-запиті, або покладаються на його відключення, і, таким чином, завжди уникають їх введення.
Якщо припустити, що він увімкнено, а потім запустить код у системі, де він не відкривається, відкриваючи широкі отвори для введення SQL.
Якщо припустити, що він вимкнений, а це не так, це призведе до того, що зворотні косої риси фактично зберігаються в БД, викликаючи некрасиві / неправильні рядки.
Також немає надзвичайно простого способу обробки обох випадків - вам потрібно перевірити, чи він увімкнено за допомогою, get_magic_quotes_gpc()
а потім застосувати stripslashes()
до всіх значень $_*
масивів - оскільки array_map
це не рекурсивно, для цього вам потрібна спеціальна функція.
Мовна функція, яка дозволяє програмістам писати коментований або безглуздо коментований код.
виходити трохи на кінцівку тут - порожнечі функції. функція завжди щось робить, отже, вона повинна або повернути результат, або якусь іншу частину інформації щодо її успіху чи невдачі.
POKE в ОСНОВНІЙ ...
Я б сказав, що збирання сміття. Це не позбавляє від необхідності думати про управління пам'яттю, але виключає сприйняття необхідності думати про управління пам’яттю, яке занадто часто виключає фактичну думку, і тоді ви отримуєте величезні качани ресурсів і не знаєте чому. Особливо, коли поведінку сучасних поколінь ГК можна було б описати без надто великої гіперболи як "один великий витік пам'яті за рахунок дизайну".
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 ++, які виникли б у вас, якщо ви мали використовувати посилання. Як би ви назвали віртуальну функцію на непрозорій структурі без вказівників?