Które funkcje językowe są uważane za szkodliwe? [Zamknięte]


20

Proszę wyjaśnić, dlaczego i listy, które języki mają (mis) funkcja realizowana O ile wiesz.

Opublikuj to, co uważasz za szkodliwe, a nie to, co lubisz.



2
@sbi Możesz również przeczytać na tej samej stronie „XMLHttpRequest
uznane

1
Wszystkie są uważane przez kogoś za szkodliwe, z możliwym wyjątkiem podstawowych wyrażeń.
David Thornley,


3
@David Thornley: a = 1/0- podstawowe wyrażenie, szkodliwe. ;-)
Orbling

Odpowiedzi:


37

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:

<?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";
}
?>

To okropne. Chociaż rozumiem
potrzebę,

14
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.

Tony Hoare wyjaśnia

* Dostosowałem wyrażenie wymyślone przez Tony'ego Hoare'a, aby odzwierciedlić rzeczywistą stratę w tych dniach :-)


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:

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

Aaarg! Co zrobiłeś z moim wektorem STL !?


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 ++.


18
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.


7
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.


Dobry Boże tak. xkcd.com/292
TheLQ

3
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.


13
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.


+1 - Możemy nie zgadzać się co do cukru iteracyjnego, ale mogę się z tym zgodzić w 100%.
ChaosPandion

7

PLEASEw INTERCAL. Nie używaj go wystarczająco, narzeka. Używaj go za dużo, narzeka.


2
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).


6

„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();
}

... w połączeniu z faktem, że liczba całkowita lub wskaźnik jest prawidłowym warunkiem.
barjak

5

Dostęp do modyfikatorów w Javie z domyślnym pakietem języka prywatnego i konwencją programowania prywatnego.


5

Zastępowanie niezdefiniowanych zmiennych pustym ciągiem w powłoce bez ostrzeżeń: rm -rf $nosuchvar/* .


+1 Argh! LOL - przerażający domyślny (i zabawny / przerażający przykład)
Orbling

@Zamawianie czegoś podobnego ${varname:-/dev/null}może być obejściem ...
duros

Cóż, pokazuje to potrzebę zawsze defensywnego sprawdzania istnienia zmiennej i zawartości przed użyciem.
Orbling

4

Możliwość obrotu w LOGO przeciwnie do ruchu wskazówek zegara. Wtf, pozwala po prostu obrócić 360 - xstopnie w prawo .


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.
Jason Baker

4

Zmienne Zmienne w PHP

Tylko dlatego, $canże nie masz na myśli ciebie$$should


1
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.
Kendall Hopkins

1
Komentarz miał być żartem, przepraszam, że nie wyjaśniłem tego, ale ponieważ pytasz tutaj, jest to najlepszy przykład, w którym zmienne zmienne wyjaśniają rozwiązanie . Przyznaję, że to raczej zły przykład.
Joe D

3

WithOświadczenie w Delphi przychodzi do głowy, chociaż istnieją przypadki, gdy jest to przydatne.


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
Maksee


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).


1

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ć”.


7
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)
Yttrill

1

magic_quotesw 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_mapnie jest rekurencyjny, potrzebujesz do tego niestandardowej funkcji.


Lub możesz po prostu użyć sparametryzowanych zapytań.
Pieter B

Nawet wtedy otrzymasz odwrotne ukośniki, jeśli włączone są cytaty magiczne i nie spodziewałeś się tego.
ThiefMaster

-3

Funkcja języka, która umożliwia programistom pisanie kodu bez komentarza lub bez komentarza.


1
I jak to naprawić?
Maniero

1
@bigown: wdrażając funkcję komentowania lub umrzeć: D.
tia

3
To się nazywa programowanie literackie. en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
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.


3
Pascal miał procedury (bez wartości zwracanej), a także funkcje (wartość zwracaną).
Jon Onstott,

Funkcje zawsze coś robią (no cóż, funkcja zastępcza czy ktoś?) , Ale często nie trzeba o tym nikomu mówić.
Orbling

-4

POKE w języku BASIC ...


7
POKE było niesamowite.
Shog9

2
Na początku poke był jedynym rozsądnym sposobem na osiągnięcie pewnych rzeczy w podstawowym zakresie. Muzyka w Apple] [przychodzi mi na myśl ...
Bill

2
Nie można wiele zrobić bez POKE na Commodore 64, jeśli dobrze pamiętam.
MetalMikester

1
Nie zapomnij PEEK, oba niezbędne.
Orbling

-5

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”.


2
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.

Oprócz null... ale to inna historia.


5
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?
KitsuneYMG
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.