Jest to zdecydowanie najgorsza funkcja, jaką kiedykolwiek wdrożono ze względów czytelności i bezpieczeństwa. Zasadniczo wszystkie otrzymane parametry GET są przekształcane w zmienne.
Na przykład z tym adresem URL: /index.php?value=foobar
Możesz wykonać następujące czynności:
<?php
echo $value; // return foobar
?>
Kiedy czytasz kod, bardzo mylące jest wiedzieć, skąd pochodzi zmienna.
Również jeśli funkcja jest niewłaściwie używana, może prowadzić do luki bezpieczeństwa. Oto przykład kodu z php.net, który pokazuje, jak można go niewłaściwie wykorzystać:
<?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";
}
?>
Należy zauważyć i podkreślić, że rejestracja globałów nie jest domyślnie włączona od PHP 4.2 (aż do 2000 roku), jest przestarzała w PHP 5.3 (2009) i zostanie całkowicie usunięta w PHP 6, ale ludzie wciąż wracają do „globalnego rejestru OMG” nawet po 10 latach.
1
Całkiem beznadziejny PHP
Ming-Tang,
@SHiNKiROU To nie jest beznadziejne, ta funkcja została uznana za przestarzałą i zostanie usunięta w PHP 6.
HoLyVieR
1
To nie jest beznadziejne, jest tak daleko w tyle za wieloma innymi językami, że jedynym powodem, dla którego wszyscy go używają, jest to, że do niedawna dużo łatwiej było uzyskać tanie webhosting dla niego niż w innych językach.
intuicyjnie, 19.10
22
Zezwalaj domyślnie na Null, błąd „bilion” * dolarów. Przepraszam Tony Hoare. Prawie każdy język dostępny na planecie.
To nie jest cecha lub błąd, ale raczej brak cechy. Posiadanie niewymiennych typów referencyjnych nie jest czymś, co można łatwo wpaść w język; Wymaga to wiele przemyślenia i dobrego projektu i jest bardzo trudne do wykonania w sposób, który nie przypomina walki z kompilatorem. Spec # i Singularity pokazują, jak ciężko jest.
imgx64
@ imgx86, nie, to zdecydowanie błąd. Niewymienne typy referencyjne to funkcja dodana w odpowiedzi na błąd zerowy, aby umożliwić zgodność z systemem typów, który zwykle zezwala na null.
Matt Olenik
@Kyralessa: Być może chce mieć pewność, że HoLyVieR dostanie odznakę populistyczną? :-) Zgadzam się, nie ma sensu akceptować własnej odpowiedzi w ten sposób.
Macneil
18
MAKRO C i C ++. Jeśli kiedykolwiek będę musiał zobaczyć kolejny błąd kompilatora z powodu wybrania przez makro standardowej nazwy funkcji dla swojego makra, co psuje mój kod, krzyczę. Zobaczmy ostatni obrażający:
Przestrzeń nazw jest jedną z rzeczy, dzięki której typedefs i szablony są od razu bardziej przyjazne.
Shog9
4
Zgoda, ale tylko dlatego, że nowoczesne języki znalazły zamienniki dla funkcji makr tekstowych. Kiedy je wymyślono, makra były dobrą rzeczą, ponieważ technologia kompilatora była tak prymitywna.
dsimcha
gdzie znalazłeś to makro?
rwong
@dsimcha - Nie wiem o tym. Makra Lisp istnieją już od dawna.
Jason Baker
2
@Jason: Nie powalam „prawdziwych” makr AST w stylu Lisp, które są nadal przydatne i fajne. Nienawidzę tylko makr w stylu C / C ++, które działają wyłącznie na poziomie tekstowym, nie mają pojęcia zakresu, pozwalają tworzyć absurdalnie nieszczelne abstrakcje i zaciemniony kod, i mogą być całkowicie przestarzałe przez bardziej nowoczesne funkcje, z których jedna, jak na ironię, , to „prawdziwe” makra.
dsimcha
14
Domyślnie przeglądanie w instrukcjach przełączania C i C ++.
Jest to zawsze przydatna funkcja w całym kodzie, który napisałem. Jak to jest błędne?
greyfade
6
@greyfade: Jest to pomocne, dopóki nie zapomnisz breakoświadczenia lub nie dodasz sprawy między dwiema skrzynkami (lub zmienisz ich kolejność), nie zauważając, że między nimi nastąpił błąd. Nie widzę żadnego sposobu, aby ten upadek był lepszy niż sposób C # wymagający albo przerwy, albo sprawy goto itp.
Tim Goodman
9
Urządzenie Duffa drwi z twojej bezkarności!
Jesse C. Slicer
3
zgadzam się. Domyślnie nie jest to dobra funkcja.
11
Czy nikt nie czyta? Powiedział upadek BY DOMYŚLNIE
Matt Olenik
13
Konwersje typu niejawnego, gdy typy, które są konwertowane, nie mają oczywistej relacji. Na przykład, konwersja losowej, nienumerycznej stringna int, jak w PHP.
Należy zauważyć, że po obejściu tego problemu, takie rzeczy stają się nieistotne. Jest to naprawdę problem, jeśli nie wykonujesz żadnych kontroli w obszarach krytycznych pod kątem wartości wprowadzonych przez użytkownika, ale jest nieskończenie użyteczny, jeśli, powiedzmy, wiesz, że coś będzie liczbą, ale jest ciągiem. Na przykład pole z bazy danych prawdopodobnie zostanie zwrócone jako ciąg, a Ty nie chcesz się martwić o jego rzutowanie.
Tarka
2
@Slokun: Czy możesz wymyślić lepszy przykład? Po co przechowywać wartości całkowite w bazie danych za pomocą typu ciągu?
Steven Evers
@SnOrfus Przekazywanie liczby w adresie URL, danych wejściowych użytkownika, funkcjach i innych rzeczach wspólnych dla języków nietypowych.
TheLQ
Jest to również problem w C, ponieważ wartość łańcucha cytowanego jest wskaźnikiem, który można przekonwertować na liczbę całkowitą, co może powodować, że konstrukcje, które wyglądają, jakby miały sens poprawnie kompilować, ale generowały bzdury. W C ++ można zdefiniować funkcje konwersji za pomocą słowa kluczowego explicit, które zatrzymuje konwersje typu niejawnego, ale nadal występują problemy.
David Thornley,
@TheLQ: Jeśli dane wprowadzane są przez użytkownika, musisz je zweryfikować, aby dowiedzieć się, czy jest to liczba. Jak powiedział @Slokun. Jeśli czytasz dane z pliku, możesz spodziewać się, że dane liczbowe będą tam, gdzie powinny, ale zgłoszenie wyjątku w przypadku uszkodzenia dysku jest często lepsze niż zwykłe losowe 0dla pewnej wartości.
intuicyjnie,
12
goto : choć w rzadkich przypadkach jest ok, jest częściej niewłaściwie używany i prowadzi do trudnych do odczytania programów.
Widziałem coś przeciwnego, gdzie zezwolenie na rozsądne użycie goto uratowałoby program przed utworzeniem 3 milionów linii kodu.
Dave
2
Ach, hiperbola ... Prawidłowa technika literacka.
Robert Harvey
11
ŻADEN
To, że funkcja jest często niewłaściwie używana, nie czyni jej szkodliwym.
IMHO cały „uważany jest za szkodliwy” to Reductio ad Hitlerum dyskusji w języku programowania.
Większość, jeśli nie wszystkie, „szkodliwych” funkcji ma lub miało pierwotnie bardzo ważny przypadek użycia lub są po prostu metodami wygody. Programiści muszą zrozumieć zalety i wady oraz odpowiednio kodować.
Jeśli twoje pytania miały być czymś w rodzaju „jakie cechy językowe mają wspólne pułapki lub niefortunne skutki uboczne”, moja odpowiedź byłaby inna.
[edytuj] Żeby było jasne: nie mam na myśli ciągłego używania przestarzałych metod. Jeśli programiści tracą na wartości / usuwają funkcję, powinieneś skorzystać z jej zamiany. Mam na myśli koncepcję, że obecna część języka jest uważana za szkodliwą, ponieważ niektórym nie podoba się to, co zachęca, lub kompromis związany z jego używaniem, o którym mówi wiele osób.
Nie zgadzam się, dobry kontrprzykład to moja odpowiedź. Globalny rejestr PHP był po prostu zły, bez względu na to, jak z niego korzystasz. Dlatego jest przestarzały i zdecydowanie odradzam korzystanie ze starszej wersji PHP.
HoLyVieR
5
+1 W niepowołane ręce każdy konstrukt językowy jest szkodliwy.
mouviciel
5
Dobra uwaga ... nawet jeśli 95% gotos jest złych, sama funkcja jest nadal warta dla pozostałych 5%
eds
1
Myślę, że bardziej przypomina to umieszczenie przycisku gniazda wyrzutnika obok przycisku włączania / wyłączania radia. Sama funkcja może nie być zła, ale nie można zapobiec jej przypadkowemu użyciu.
LennyProgrammers
1
Myślę, że jest to programowy odpowiednik „pistolety nie zabijają ludzi, ludzie to robią”.
Orbling
7
Autovivification (lub inna funkcja bind-variable-on- (przypisanie | użycie)) to funkcja, która według mnie daje najwięcej błędów.
Tego języka nie należy traktować poważnie. Został stworzony, aby być bardzo „unikalnym” językiem programowania, więc jest pełen rzeczy (np. Comefrom - na samą myśl o mnie), które nie mają sensu.
ShdNx
4
Myślałem, że to będzie oczywiste, ale tak, wiem, że to nie jest poważny język.
Alan Pearce
2
Niestety, niektórzy ludzie są tu zbyt poważni.
Mark C
1
Właśnie odkryłem ten język w zeszłym tygodniu na Wikipedii i byłem zdumiony, jak popularny był (i wciąż istnieje O_O).
Oliver Weiler,
Istnieje wiele języków „wyzwania” i są one zawsze popularne, ponieważ koderzy wykonują tę pracę z powodu miłości do pościgu. Bardzo popularny również w przypadku pytań do wywiadu, ponieważ są one celowo rozwarte, prowokujące do myślenia i trudne.
Orbling
7
Chociaż niektórzy ludzie nie zgadzają się z tym człowiekiem lub różnymi rzeczami, które mówi, wiele JavaScript Douglasa Crockforda : Dobre części to w zasadzie to pytanie dotyczyło JS. Wśród skarg Crockforda:
Domyślnie globalny zasięg dla wszystkiego (DC pokazuje, jak używać funkcji / obiektów jako przestrzeni nazw i ograniczników zakresu, aby się do tego zakłócać).
Stwierdzenia podobne do tego with, których niepowodzeniem jest definiowanie rzeczy w globalnej przestrzeni nazw. (Gah! To jak motto JS, jeśli zawiedziesz, to zawiodłeś tak mocno, jak to możliwe !)
Nieoczekiwane zachowanie z ==operatorem, które zasadniczo wymaga, aby zawsze używać ===operatora.
Wprowadzanie średnika.
Naprawdę całą JS należy uważać za szkodliwą, może nawet cały język, ale dobre części są tak cholernie dobre, że w pewnym sensie to nadrabia (przynajmniej dla mnie).
„Niepowodzenie po cichu” we Flash Playerze jako zachowanie domyślne
Ok, tak naprawdę nie jest to cecha samego języka, ale wciąż dość blisko spokrewniona.
Nagle Twoja aplikacja Flash / Flex przestaje działać i nikt nie może dać ci najmniejszej wskazówki, co się stało. Bez komunikatu o błędzie, bez śledzenia stosu, bez niczego. Po prostu nagle przejście ekranu się nie dzieje (lub dzieje się w zupełnie niewłaściwy sposób), przyciski nie reagują już na kliknięcia lub kombinacje są puste zamiast zapełnione niektórymi wpisami.
Ta sama funkcja jest odpowiedzialna za kilka raportów ze wzruszeniem ramion i całą masę siwych włosów, które dostaję. -.- Chociaż wyskakiwanie tajemniczej wiadomości w twarz użytkownika również nie jest pożądane, może przynajmniej pomóc deweloperowi w rozwiązaniu problemu.
Ale Flash Player pozostawia cię w ciemności, polegając na opisie użytkownika (podczas gdy problem może pochodzić z zupełnie innej lokalizacji w kodzie, która nie ma nic wspólnego z tym, co robił użytkownik). Tylko jeśli korzystasz z odtwarzacza debugowania, faktycznie wyświetla się okno wyskakujące z komunikatem o błędzie i informacją o stosie.
Jednak interesujące może być oglądanie filmów flash osadzonych w niektórych serwisach informacyjnych i otrzymywanie powtarzających się wiadomości o referencjach Null z używanego wbudowanego odtwarzacza SWF. :RE
Czasami aplikacje iPhone'a również zawieszają się bez ostrzeżenia, w niektórych dziwnych momentach
Ming-Tang,
3
Ciche zawodzenie w czymkolwiek jest dość kiepskie.
6
W C / C ++: te przypisania są również wyrażeniami POŁĄCZONYMI z bardzo podobnymi operatorami przypisania = i porównania ==. Nie jest to szkodliwa funkcja sama w sobie, ale jest to sposób na łatwe wprowadzenie (czasem subtelnych) błędów przez przypadkowe wpisanie operatora.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Minęło trochę czasu, odkąd użyłem LOGO. Dlaczego to jest szkodliwe?
Mason Wheeler
5
Logo może służyć do sterowania prawdziwym, fizycznym robotem z żółwiami. Czasami chcesz, aby żółw skręcił w określonym kierunku lub skręcił więcej niż jeden raz. Na przykład, może programujesz to do tańca.
Daniel Cassidy
@Mason, To miał być żart.
jjnguy
3
Tak, szczególnie w LOGO For Clocks.
intuicyjnie,
1
Uwielbiam Logo (patrz programmers.stackexchange.com/questions/21028/... ) i jest to doskonały język nauczania, szczególnie dla młodych ludzi. Kiedy miałem 11 lat i po raz pierwszy użyłem logo, większość mojej klasy nie znała aż tak dużej geometrii, ale powiedziano im, że 90 to ćwierć obrotu i wiedzą, że od lewej do prawej. Nie jest to więc cecha negatywna - to samo, dlaczego nie mnożymy przez odwrotność zamiast operatora dzielenia. Tak, wiem, że to żart.
Orbling
4
Zatrzymywanie wątku z innego wątku
W Javie i w innym języku można dowolnie zatrzymać wątek od innego, nie dając czasu, aby zatrzymany wątek zakończył się poprawnie. Ta umiejętność została uznana za przestarzałą, biorąc pod uwagę ogrom problemu, jaki może ona przynieść w prawie każdej sytuacji.
Chociaż przypuszczam, że może to być szkodliwe, zdarza się, że jest to niezwykle przydatne (np. Debugger obsługujący pojedyncze punkty przejścia i punkty przerwania).
Jerry Coffin,
1
@Jerry Debugowanie to zupełnie inna sprawa, nie zatrzymuje procesu, wstrzymuje go.
HoLyVieR
wręcz przeciwnie, zatrzymuje wątek. Najwyraźniej mówisz o zabiciu nici, a nie tylko jej zatrzymaniu. To jest trochę trudniejsze do uzasadnienia ...
Jerry Coffin,
Nie uważam tego jednak za koniecznie funkcję językową. Bardziej standardowa biblioteka.
Jak zwykle Perl ... ma dostępną (potencjalnie niebezpieczną) funkcję, ma łatwy, najlepszy sposób, aby ją wyłączyć ( use strict) i łatwy sposób, aby włączyć ją ponownie dokładnie tam, gdzie tego chcesz ( no strict 'refs').
1
Nigdy nie znalazłem zastosowania do posiadania nazwy zmiennej dynamicznej. I tylko raz to zrobiłem, sprawiło, że kod stał się nieczytelny i moment WTF kilka miesięcy później, kiedy ponownie go odwiedziłem.
TheLQ
Mmm, aplikacje obejmują metaprogramowanie przy użyciu wstrętnych zmiennych innych ludzi lub tablicy symboli (która, jak sądzę, jest nieco inna).
1
@Joe Rzuciłbym ci wyzwanie, abyś pokazał mi jeden przykład, w którym zmienne zmienne wyjaśniają rozwiązanie.
Dobry przypadek, gdy przeniosłem coś z Delphi do Lazarusa, a mój potomek TControl zawierał „z Canvas do ... Width, Height” odnoszący się do rozmiarów kontrolnych, ale Lazarus TCanvas miał swoją szerokość i Delphi, więc doprowadziło to do błędnie skompilowanego kodu
Tablice w seplenie zaczynające się od indeksu car! : P
Joe D
Również w Lua - niewybaczalne!
Tobu,
2
W Perlu kontekst skalarny vs. kontekst listowy może być trudny. Ma kilka dobrych punktów, które sprawiają, że pewne operacje są wygodne, ale czasami napotykasz coś strasznego, na przykład całkowicie zmieniając znaczenie operatora (potencjalnie z dużej odległości w kodzie).
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)
To po prostu nie w porządku.
(Wynika to z próby stworzenia czegoś, co działa podobnie do operatora normalnego zasięgu, więc można powiedzieć coś w pętli next if /start_regex/ .. /end_regex/).
Człowiek, który jest taki zagmatwany. Najgorszą rzeczą w nauce Perla było to, że mogłem się tym zająć.
glenatron,
Zawsze myślałem, że wszystko, co pozwala na zwrócenie funkcji na wiele sposobów, było wygodną wygodą.
Orbling
2
Względna składnia importu w Pythonie 2.x. Załóżmy, że mam pakiet, x.pluginsktóry dodaje obsługę różnych innych bibliotek x. Załóżmy, że mam sqlalchemymoduł, x.pluginsdzięki czemu mogę dodać obsługę sqlalchemy x. Jak myślisz, co się stanie, jeśli dodam następujący wiersz do pliku sqlalchemy.py?
import sqlalchemy
Odpowiedź jest taka, że moduł spróbuje się zaimportować. Ta składnia zasadniczo uniemożliwia importowanie rzeczywistego globalnego pakietu sqlalchemy. Python 2.5 dodał sposób, aby określić, że jest to import względny:
from . import sqlalchemy
... ale dopiero w Pythonie 3 pozbyliśmy się pierwszej składni (chociaż można ją wyłączyć w Pythonie 2.6+ from __future__ import absolute_import).
sun.misc.unsafe jest moim ulubionym od zawsze; zbiór „potrzebowaliśmy tego, aby zaimplementować różne rzeczy, ale naprawdę, naprawdę nie sądzę, że powinieneś go używać”.
Każdy dobry język powinien mieć niebezpieczną paczkę w standardowej bibliotece. Zaimportowanie tego pakietu wyraźnie pokazuje, że masz zamiar robić rzeczy, których nie można przenieść na niższy poziom. Alternatywami są: 1- Posiadanie niebezpiecznych funkcji w samym języku (na przykład C ++) i 2- Konieczność używania innego języka, takiego jak C, do robienia rzeczy na niskim poziomie (na przykład Python i Ruby). Niebezpieczne podejście do pakietu wydaje mi się znacznie lepsze.
imgx64,
1
Wspólne bloki FORTRAN. Jeśli popełnisz prosty błąd, jedna część aplikacji może zablokować globale innej części.
FORTRAN przypisał instrukcję goto / instrukcję zmiany COBOL. Kod samomodyfikujący. Niebezpieczeństwo, ostrzeżenie, latające potwory spaghetti !!
FORTRAN nie miał instrukcji ALTER. FORTRAN miał instrukcję ASSIGN z przypisanym GOTO. COBOL miał instrukcję ALTER, która służyła podobnemu celowi.
John R. Strohm
@John - dzięki. Moja pamięć przypisywania / zmiany jest słaba ... zwłaszcza dlatego, że nauczono mnie, aby nigdy ich nie używać.
Stephen C
1
Orientacja obiektowa (ze wszystkich języków o typie statycznym). Założę się, że ta funkcja ma i będzie nadal kosztować znacznie więcej niż zerowe wskaźniki. Orientacja obiektowa jest dobra tylko w dynamicznym języku przekazującym wiadomości . Dlatego należy go usunąć z dynamicznych języków, takich jak Python (ponieważ nie używa przekazywania wiadomości, ale konwencjonalne wywoływanie podprogramów).
Python obsługuje (we wszystkich celach i celach) idiom przekazujący komunikat smalltalk. Po prostu nie ma takiej nazwy. Po drugie, myślę, że przynajmniej trochę dyskusyjne jest nazywanie tak wszechobecnej funkcji językowej szkodliwą.
Jason Baker
Orientacja obiektowa wciąż poprawia ponowne użycie kodu i enkapsulację kodu / danych. Niezależnie od statycznego / dynamicznego wykorzystania funkcji.
Orbling
@Orbling: W porównaniu do czego? Moim zdaniem funkcjonalne języki programowania mają większe wykorzystanie kodu i myślę, że system modułów Haskell jest całkiem dobry do enkapsulacji kodu / danych.
LennyProgrammers,
@ Lenny222 W porównaniu do standardowego programowania imperatywnego. Ja też wolę podejście funkcjonalne, Haskell jest moim preferowanym językiem.
Orbling
@Jason Baker: cóż, z pewnością jest to dyskusyjne, ale bycie tak wszechobecnym jest właśnie tym, co czyni go tak szkodliwym! OP poprosił o moją opinię, a ja ją wyraziłem. Tylko dlatego, że grupka Lemmingsów przeskakuje z urwiska, nie czyni zachowania rozsądnym. W tym przypadku jest matematycznie udowodnione, że OOP nie działa, a poprawny paradygmat jest dobrze akceptowany: teoria kategorii jest sposobem na reprezentowanie abstrakcji (w rzeczywistości jest to teoria abstrakcji)
Niedoświadczeni programiści albo polegają na tym, że jest on włączony, a tym samym zakładają, że wszystkie dane wejściowe użytkownika są zabezpieczone przed użyciem w zapytaniu SQL, albo polegają na tym, że są wyłączone i dlatego zawsze unikają wprowadzania danych.
Zakładając, że jest włączony, a następnie uruchamia kod w systemie, w którym go nie ma, otwiera się szeroko luki w iniekcjach SQL.
Zakładając, że jest wyłączony, a nie jest, spowoduje to, że odwrotne ukośniki będą faktycznie przechowywane w DB, co spowoduje brzydkie / niepoprawne łańcuchy.
Nie ma również niezwykle prostego sposobu obsługi obu przypadków - musisz sprawdzić, czy jest włączony przy użyciu, get_magic_quotes_gpc()a następnie zastosować stripslashes()do wszystkich wartości w $_*tablicach - ponieważ array_mapnie jest rekurencyjny, potrzebujesz do tego niestandardowej funkcji.
To nie jest funkcja, ale jest to niezwykle znany błąd w interfejsie użytkownika, większość ludzi zna go po łacińskiej nazwie: Homo Sapiens.
Joe D
-3
wychodząc trochę na kończynie - funkcje void. funkcja zawsze coś robi, dlatego powinna zwrócić wynik lub inną informację dotyczącą jego sukcesu lub niepowodzenia.
Jeśli masz jakieś referencje siedzące gdzieś w jakiejś kolekcji, masz inne problemy.
Chinmay Kanchi,
2
Dlatego języki gc'ed mają słabe referencje :)
Chinmay Kanchi,
4
Chociaż GC z pewnością ma zarówno mocne, jak i słabe strony, muszę powiedzieć, że Mason ma w tej kwestii dużo więcej racji niż zła. W rzeczywistości widziałem, jak ludzie używający GC spędzają dużo więcej czasu na zarządzaniu pamięcią, ponieważ skończyło się na tym, że próbowali włamać się do rzeczy po fakcie zamiast planować to z góry. GC ogólnie zapobiega także deterministycznemu zniszczeniu, co prowadzi do dodatkowej pracy związanej z zarządzaniem wszystkimi zasobami innymi niż pamięć.
Jerry Coffin,
3
@ChaosPandion: Czy naprawdę jestem głupcem, jeśli uważam, że na nowoczesnej maszynie wielozadaniowej, aby powstrzymać stronicowanie przed obniżeniem wydajności systemu, pamięć powinna zostać zwolniona jak najszybciej? Żaden GC nigdy nie zbliżył się nawet do osiągnięcia tego rezultatu, a tak naprawdę pokoleniowy kolektor śmieci, który ma być najlepszą, najnowocześniejszą odmianą, robi dokładnie odwrotnie: aby uzyskać najlepszą wydajność, musi wypuścić pamięć tak późno, jak to możliwe. Nie widzę tego jak zawsze odpowiedniego narzędzia do każdego zadania, nie wtedy, gdy spowalnia moje inne programy. Czy jestem na to głupcem?
Mason Wheeler,
2
@ Barry: Jest deterministyczny w programie. Jeśli skończę z blokiem pamięci 5 KB, to poproś o kolejne 5 KB wkrótce, co się stanie? W systemie wyrzucania elementów bezużytecznych musi zażądać nowego bloku o wielkości 5 KB, mimo że blok jest całkowicie nieużywany, chyba że GC uruchomił się w międzyczasie, w którym to przypadku można odtworzyć stary blok. Dzięki malloc i za darmo zawsze będziesz mógł odzyskać stary blok. Pomnóż to przez kilkaset tysięcy, a stanie się to prawdziwym problemem.
Mason Wheeler
-5
C, a na pewno C ++: arytmetyka wskaźników. Umożliwienie ludziom konwersji liczb całkowitych na adresy pamięci wymaga kłopotów.
A może nawet surowy dostęp do wskaźników?
W C ++ masz odwołania, które sprawiają, że wskaźniki są prawie całkowicie niepotrzebne. W pozostałych przypadkach inteligentne wskaźniki należy uznać za obowiązkowe.
Java jest również dowodem, że możesz uczynić język programowania, który wykorzystuje wskaźniki, nie pozwalając ludziom dostęp do wartości wskaźnika samego.
Wskaźniki, choć czasami trudne w użyciu, są bardzo potrzebne do dużej liczby wydajnych operacji pamięci.
Bill
1
Prawdziwe. Jednak moim zdaniem regularne przekształcanie liczb całkowitych w odwołania do pamięci lub dodawanie liczb do adresów pamięci jest obecnie najbardziej szkodliwe. W C ++ masz referencje jako doskonałą alternatywę, a także inteligentne wskaźniki / wskaźniki automatyczne, gdy naprawdę potrzebujesz, aby był wskaźnikiem.
Asgeir S. Nilsen
4
Ta odpowiedź jest poprawna tylko wtedy, gdy pracujesz na stosie oprogramowania skonstruowanym w celu ukrycia wskaźników. We wszystkich innych przypadkach odpowiedź jest błędna.
Paul Nathan
3
Niektóre języki programowania muszą mieć dostępne wskaźniki, aby można było pisać wszystkie systemy operacyjne i maszyny wirtualne dla innych języków programowania.
2
-1. Jest powód, dla którego potrzebujesz arytmetyki ptr: iteracja punktu jest szybsza niż indeksowanie. for(int i=0;i<SIZE;++i) ++arr[i]jest wolniejszy niż for(int*i=arr;i<arr+SIZE;++i)*i++. Wszystko, co udało się udowodnić, to, że potrzebujesz wskaźnika lub nigdy nie patrzyłeś sun.misc.Unsafe? Jeśli nie potrzebujesz wskaźników, wyjaśnij, jak napisać ogólną funkcję wymiany za pomocą Java. (np. int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Nie wspominając już o wszystkich problemach w c / c ++, które miałbyś, gdybyś miał użyć referencji. Jak nazwałbyś funkcję wirtualną nieprzezroczystą strukturą bez wskaźników?
a = 1/0
- podstawowe wyrażenie, szkodliwe. ;-)Odpowiedzi:
Zarejestruj Globals w PHP
Informacje: http://php.net/manual/en/security.globals.php
Jest to zdecydowanie najgorsza funkcja, jaką kiedykolwiek wdrożono ze względów czytelności i bezpieczeństwa. Zasadniczo wszystkie otrzymane parametry GET są przekształcane w zmienne.
Na przykład z tym adresem URL: /index.php?value=foobar
Możesz wykonać następujące czynności:
Kiedy czytasz kod, bardzo mylące jest wiedzieć, skąd pochodzi zmienna.
Również jeśli funkcja jest niewłaściwie używana, może prowadzić do luki bezpieczeństwa. Oto przykład kodu z php.net, który pokazuje, jak można go niewłaściwie wykorzystać:
źródło
Zezwalaj domyślnie na Null, błąd „bilion” * dolarów. Przepraszam Tony Hoare. Prawie każdy język dostępny na planecie.
Tony Hoare wyjaśnia
* Dostosowałem wyrażenie wymyślone przez Tony'ego Hoare'a, aby odzwierciedlić rzeczywistą stratę w tych dniach :-)
źródło
MAKRO C i C ++. Jeśli kiedykolwiek będę musiał zobaczyć kolejny błąd kompilatora z powodu wybrania przez makro standardowej nazwy funkcji dla swojego makra, co psuje mój kod, krzyczę. Zobaczmy ostatni obrażający:
Aaarg! Co zrobiłeś z moim wektorem STL !?
źródło
Domyślnie przeglądanie w instrukcjach przełączania C i C ++.
źródło
break
oświadczenia lub nie dodasz sprawy między dwiema skrzynkami (lub zmienisz ich kolejność), nie zauważając, że między nimi nastąpił błąd. Nie widzę żadnego sposobu, aby ten upadek był lepszy niż sposób C # wymagający albo przerwy, albo sprawy goto itp.Konwersje typu niejawnego, gdy typy, które są konwertowane, nie mają oczywistej relacji. Na przykład, konwersja losowej, nienumerycznej
string
naint
, jak w PHP.źródło
explicit
, które zatrzymuje konwersje typu niejawnego, ale nadal występują problemy.0
dla pewnej wartości.goto : choć w rzadkich przypadkach jest ok, jest częściej niewłaściwie używany i prowadzi do trudnych do odczytania programów.
źródło
ŻADEN
To, że funkcja jest często niewłaściwie używana, nie czyni jej szkodliwym.
IMHO cały „uważany jest za szkodliwy” to Reductio ad Hitlerum dyskusji w języku programowania.
Większość, jeśli nie wszystkie, „szkodliwych” funkcji ma lub miało pierwotnie bardzo ważny przypadek użycia lub są po prostu metodami wygody. Programiści muszą zrozumieć zalety i wady oraz odpowiednio kodować.
Jeśli twoje pytania miały być czymś w rodzaju „jakie cechy językowe mają wspólne pułapki lub niefortunne skutki uboczne”, moja odpowiedź byłaby inna.
[edytuj] Żeby było jasne: nie mam na myśli ciągłego używania przestarzałych metod. Jeśli programiści tracą na wartości / usuwają funkcję, powinieneś skorzystać z jej zamiany. Mam na myśli koncepcję, że obecna część języka jest uważana za szkodliwą, ponieważ niektórym nie podoba się to, co zachęca, lub kompromis związany z jego używaniem, o którym mówi wiele osób.
źródło
Autovivification (lub inna funkcja bind-variable-on- (przypisanie | użycie)) to funkcja, która według mnie daje najwięcej błędów.
źródło
PLEASE
w INTERCAL. Nie używaj go wystarczająco, narzeka. Używaj go za dużo, narzeka.źródło
Chociaż niektórzy ludzie nie zgadzają się z tym człowiekiem lub różnymi rzeczami, które mówi, wiele JavaScript Douglasa Crockforda : Dobre części to w zasadzie to pytanie dotyczyło JS. Wśród skarg Crockforda:
Domyślnie globalny zasięg dla wszystkiego (DC pokazuje, jak używać funkcji / obiektów jako przestrzeni nazw i ograniczników zakresu, aby się do tego zakłócać).
Stwierdzenia podobne do tego
with
, których niepowodzeniem jest definiowanie rzeczy w globalnej przestrzeni nazw. (Gah! To jak motto JS, jeśli zawiedziesz, to zawiodłeś tak mocno, jak to możliwe !)Nieoczekiwane zachowanie z
==
operatorem, które zasadniczo wymaga, aby zawsze używać===
operatora.Wprowadzanie średnika.
Naprawdę całą JS należy uważać za szkodliwą, może nawet cały język, ale dobre części są tak cholernie dobre, że w pewnym sensie to nadrabia (przynajmniej dla mnie).
źródło
„Niepowodzenie po cichu” we Flash Playerze jako zachowanie domyślne
Ok, tak naprawdę nie jest to cecha samego języka, ale wciąż dość blisko spokrewniona.
Nagle Twoja aplikacja Flash / Flex przestaje działać i nikt nie może dać ci najmniejszej wskazówki, co się stało. Bez komunikatu o błędzie, bez śledzenia stosu, bez niczego. Po prostu nagle przejście ekranu się nie dzieje (lub dzieje się w zupełnie niewłaściwy sposób), przyciski nie reagują już na kliknięcia lub kombinacje są puste zamiast zapełnione niektórymi wpisami.
Ta sama funkcja jest odpowiedzialna za kilka raportów ze wzruszeniem ramion i całą masę siwych włosów, które dostaję. -.- Chociaż wyskakiwanie tajemniczej wiadomości w twarz użytkownika również nie jest pożądane, może przynajmniej pomóc deweloperowi w rozwiązaniu problemu.
Ale Flash Player pozostawia cię w ciemności, polegając na opisie użytkownika (podczas gdy problem może pochodzić z zupełnie innej lokalizacji w kodzie, która nie ma nic wspólnego z tym, co robił użytkownik). Tylko jeśli korzystasz z odtwarzacza debugowania, faktycznie wyświetla się okno wyskakujące z komunikatem o błędzie i informacją o stosie.
Jednak interesujące może być oglądanie filmów flash osadzonych w niektórych serwisach informacyjnych i otrzymywanie powtarzających się wiadomości o referencjach Null z używanego wbudowanego odtwarzacza SWF. :RE
źródło
W C / C ++: te przypisania są również wyrażeniami POŁĄCZONYMI z bardzo podobnymi operatorami przypisania = i porównania ==. Nie jest to szkodliwa funkcja sama w sobie, ale jest to sposób na łatwe wprowadzenie (czasem subtelnych) błędów przez przypadkowe wpisanie operatora.
źródło
Dostęp do modyfikatorów w Javie z domyślnym pakietem języka prywatnego i konwencją programowania prywatnego.
źródło
Zastępowanie niezdefiniowanych zmiennych pustym ciągiem w powłoce bez ostrzeżeń:
rm -rf $nosuchvar/*
.źródło
${varname:-/dev/null}
może być obejściem ...Możliwość obrotu w LOGO przeciwnie do ruchu wskazówek zegara. Wtf, pozwala po prostu obrócić
360 - x
stopnie w prawo .źródło
Zatrzymywanie wątku z innego wątku
W Javie i w innym języku można dowolnie zatrzymać wątek od innego, nie dając czasu, aby zatrzymany wątek zakończył się poprawnie. Ta umiejętność została uznana za przestarzałą, biorąc pod uwagę ogrom problemu, jaki może ona przynieść w prawie każdej sytuacji.
źródło
Zmienne Zmienne w PHP
Tylko dlatego,
$can
że nie masz na myśli ciebie$$should
źródło
use strict
) i łatwy sposób, aby włączyć ją ponownie dokładnie tam, gdzie tego chcesz (no strict 'refs'
).With
Oświadczenie w Delphi przychodzi do głowy, chociaż istnieją przypadki, gdy jest to przydatne.źródło
Tablice w AWK od indeksu 1 !
źródło
car
! : PW Perlu kontekst skalarny vs. kontekst listowy może być trudny. Ma kilka dobrych punktów, które sprawiają, że pewne operacje są wygodne, ale czasami napotykasz coś strasznego, na przykład całkowicie zmieniając znaczenie operatora (potencjalnie z dużej odległości w kodzie).
To po prostu nie w porządku.
(Wynika to z próby stworzenia czegoś, co działa podobnie do operatora normalnego zasięgu, więc można powiedzieć coś w pętli
next if /start_regex/ .. /end_regex/
).źródło
Względna składnia importu w Pythonie 2.x. Załóżmy, że mam pakiet,
x.plugins
który dodaje obsługę różnych innych bibliotekx
. Załóżmy, że mamsqlalchemy
moduł,x.plugins
dzięki czemu mogę dodać obsługę sqlalchemyx
. Jak myślisz, co się stanie, jeśli dodam następujący wiersz do pliku sqlalchemy.py?Odpowiedź jest taka, że moduł spróbuje się zaimportować. Ta składnia zasadniczo uniemożliwia importowanie rzeczywistego globalnego pakietu sqlalchemy. Python 2.5 dodał sposób, aby określić, że jest to import względny:
... ale dopiero w Pythonie 3 pozbyliśmy się pierwszej składni (chociaż można ją wyłączyć w Pythonie 2.6+
from __future__ import absolute_import
).źródło
sun.misc.unsafe jest moim ulubionym od zawsze; zbiór „potrzebowaliśmy tego, aby zaimplementować różne rzeczy, ale naprawdę, naprawdę nie sądzę, że powinieneś go używać”.
źródło
Wspólne bloki FORTRAN. Jeśli popełnisz prosty błąd, jedna część aplikacji może zablokować globale innej części.
FORTRAN przypisał instrukcję goto / instrukcję zmiany COBOL. Kod samomodyfikujący. Niebezpieczeństwo, ostrzeżenie, latające potwory spaghetti !!
źródło
Orientacja obiektowa (ze wszystkich języków o typie statycznym). Założę się, że ta funkcja ma i będzie nadal kosztować znacznie więcej niż zerowe wskaźniki. Orientacja obiektowa jest dobra tylko w dynamicznym języku przekazującym wiadomości . Dlatego należy go usunąć z dynamicznych języków, takich jak Python (ponieważ nie używa przekazywania wiadomości, ale konwencjonalne wywoływanie podprogramów).
źródło
magic_quotes
w PHP .Niedoświadczeni programiści albo polegają na tym, że jest on włączony, a tym samym zakładają, że wszystkie dane wejściowe użytkownika są zabezpieczone przed użyciem w zapytaniu SQL, albo polegają na tym, że są wyłączone i dlatego zawsze unikają wprowadzania danych.
Zakładając, że jest włączony, a następnie uruchamia kod w systemie, w którym go nie ma, otwiera się szeroko luki w iniekcjach SQL.
Zakładając, że jest wyłączony, a nie jest, spowoduje to, że odwrotne ukośniki będą faktycznie przechowywane w DB, co spowoduje brzydkie / niepoprawne łańcuchy.
Nie ma również niezwykle prostego sposobu obsługi obu przypadków - musisz sprawdzić, czy jest włączony przy użyciu,
get_magic_quotes_gpc()
a następnie zastosowaćstripslashes()
do wszystkich wartości w$_*
tablicach - ponieważarray_map
nie jest rekurencyjny, potrzebujesz do tego niestandardowej funkcji.źródło
Funkcja języka, która umożliwia programistom pisanie kodu bez komentarza lub bez komentarza.
źródło
wychodząc trochę na kończynie - funkcje void. funkcja zawsze coś robi, dlatego powinna zwrócić wynik lub inną informację dotyczącą jego sukcesu lub niepowodzenia.
źródło
POKE w języku BASIC ...
źródło
Muszę powiedzieć, że wywóz śmieci. Nie eliminuje to potrzeby myślenia o zarządzaniu pamięcią, ale eliminuje postrzeganie potrzeby myślenia o zarządzaniu pamięcią, która zbyt często eliminuje rzeczywistą myśl, a następnie dostajesz ogromne zasoby zasobów i nie wiesz dlaczego. Zwłaszcza, gdy zachowanie współczesnych generacyjnych GC można opisać bez zbytniej hiperboli jako „jeden duży przeciek pamięci z założenia”.
źródło
C, a na pewno C ++: arytmetyka wskaźników. Umożliwienie ludziom konwersji liczb całkowitych na adresy pamięci wymaga kłopotów.
A może nawet surowy dostęp do wskaźników?
W C ++ masz odwołania, które sprawiają, że wskaźniki są prawie całkowicie niepotrzebne. W pozostałych przypadkach inteligentne wskaźniki należy uznać za obowiązkowe.
Java jest również dowodem, że możesz uczynić język programowania, który wykorzystuje wskaźniki, nie pozwalając ludziom dostęp do wartości wskaźnika samego.
Oprócz
null
... ale to inna historia.źródło
for(int i=0;i<SIZE;++i) ++arr[i]
jest wolniejszy niżfor(int*i=arr;i<arr+SIZE;++i)*i++
. Wszystko, co udało się udowodnić, to, że potrzebujesz wskaźnika lub nigdy nie patrzyłeśsun.misc.Unsafe
? Jeśli nie potrzebujesz wskaźników, wyjaśnij, jak napisać ogólną funkcję wymiany za pomocą Java. (np. int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Nie wspominając już o wszystkich problemach w c / c ++, które miałbyś, gdybyś miał użyć referencji. Jak nazwałbyś funkcję wirtualną nieprzezroczystą strukturą bez wskaźników?