Per favore, spiega perché ed elenca quali lingue hanno implementato la (mis) funzionalità Per quanto ne sai.
Pubblica ciò che consideri una funzionalità dannosa, non ciò che non ti piace.
a = 1/0
- espressione di base, dannosa. ;-)
Per favore, spiega perché ed elenca quali lingue hanno implementato la (mis) funzionalità Per quanto ne sai.
Pubblica ciò che consideri una funzionalità dannosa, non ciò che non ti piace.
a = 1/0
- espressione di base, dannosa. ;-)
Risposte:
Informazioni: http://php.net/manual/en/security.globals.php
Questa è di gran lunga la caratteristica peggiore che sia mai stata implementata per motivi di leggibilità e motivi di sicurezza. Fondamentalmente tutti i parametri GET ricevuti vengono trasformati in variabili.
Ad esempio con questo URL: /index.php?value=foobar
Puoi fare quanto segue:
<?php
echo $value; // return foobar
?>
Quando leggi il codice, è molto confuso sapere da dove proviene la variabile.
Inoltre, se la funzionalità viene utilizzata in modo improprio, può causare problemi di sicurezza. Ecco un esempio di codice da php.net che mostra come può essere utilizzato in modo improprio:
<?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";
}
?>
Consenti Null per impostazione predefinita, l'errore "trilioni" * di dollari. Scusa Tony Hoare. Quasi tutte le lingue disponibili sul pianeta.
* Ho modificato l'espressione coniata da Tony Hoare per riflettere la perdita effettiva in questi giorni :-)
MACRO C e C ++. Se dovessi mai vedere un altro errore del compilatore dovuto a qualcuno che ha scelto un nome di funzione standard per la sua macro che rovina il mio codice, urlo. Vediamo l'ultimo offensivo:
#define vector(int) new VARIANT[int];
Aaarg! Che cosa hai fatto con il mio vettore STL !?
Fallthrough per impostazione predefinita nelle istruzioni switch C e C ++.
break
dichiarazione o qualcuno aggiunge un caso tra due casi (o li riordina), senza notare che c'è stato un errore tra di loro. Non vedo in alcun modo che la caduta sia migliore del modo C # di richiedere una pausa o un caso di goto, ecc.
Le conversioni di tipo implicite quando i tipi da convertire non hanno una relazione ovvia. Ad esempio, convertendo un casuale, non numerico string
in un int
, come in PHP.
explicit
, che interrompe le conversioni di tipo implicite, ma ci sono ancora problemi.
0
valore casuale per un certo valore.
goto : anche se in rari casi va bene, è spesso usato male e porta a programmi difficili da leggere.
NESSUNA
Solo perché una funzione viene utilizzata in modo improprio frequentemente non la rende dannosa.
IMHO l'intero "è considerato dannoso" è la Reductio ad Hitlerum delle discussioni sul linguaggio di programmazione.
La maggior parte, se non tutte, delle caratteristiche "dannose" hanno, o avevano originariamente, un caso d'uso molto valido o sono semplicemente metodi di convenienza in primo luogo. Spetta agli sviluppatori comprendere i pro, i contro e il codice di conseguenza.
Se le tue domande fossero pensate per essere qualcosa del tipo "quali caratteristiche del linguaggio hanno insidie comuni o sfortunati effetti collaterali", la mia risposta sarebbe diversa.
[modifica] Per essere chiari: non intendo l'uso continuato di metodi deprecati. Se gli sviluppatori stanno deprezzando / rimuovendo una funzionalità, è necessario utilizzare la sostituzione. Mi riferisco al concetto secondo cui una parte corrente della lingua è considerata dannosa perché ad alcuni non piace ciò che incoraggia o il compromesso implicato nell'usarlo di cui molte persone discutono.
L'autovivificazione (o altra funzione di associazione variabile sull'assegnazione (assegnazione | uso) è la funzione che ho trovato per darmi il maggior numero di bug.
PLEASE
in INTERCAL. Non usarlo abbastanza, si lamenta. Usalo troppo, si lamenta.
Sebbene alcune persone non siano d'accordo con l'uomo o le varie cose che dice, molti JavaScript di Douglas Crockford : Le parti buone sono fondamentalmente questa domanda applicata a JS. Tra le lamentele di Crockford:
Ambito globale per impostazione predefinita per tutto (DC mostra come utilizzare funzioni / oggetti come spazi dei nomi e delimitatori di ambito per risolvere questo problema.)
Dichiarazioni come with
, il cui comportamento di fallimento è quello di definire le cose nello spazio dei nomi globale. (Gah! È come se il motto JS fosse se fallisci, quindi fallisci il più duramente possibile !)
Comportamento imprevisto con l' ==
operatore, che in sostanza richiede di utilizzare sempre l' ===
operatore.
Inserimento punto e virgola.
Davvero un sacco di JS dovrebbe essere considerato dannoso, forse anche l'intero linguaggio, ma le parti buone sono così dannatamente buone che in qualche modo compensano (almeno per me.)
Ok, non è proprio una caratteristica della lingua stessa, ma è ancora abbastanza correlata.
All'improvviso l'applicazione Flash / Flex smette di funzionare e nessuno può darti il minimo accenno di cosa sia successo f *. Nessun messaggio di errore, nessuna stacktrace, niente di niente. È solo che improvvisamente la transizione dello schermo non avviene (o avviene in modo completamente sbagliato), o i pulsanti non reagiscono più ai clic o le caselle combinate sono vuote invece di essere popolate con alcune voci.
Quella "caratteristica" da sola è responsabile di diverse segnalazioni di scrollate di spalle e di un sacco di capelli grigi che ho ricevuto. -.- Mentre spuntare qualche messaggio criptico in faccia all'utente non è neppure desiderabile, può almeno aiutare lo sviluppatore a risolvere il problema.
Ma Flash Player ti lascia pugnalare al buio, basandosi sulla descrizione dell'utente (mentre il problema potrebbe effettivamente provenire da una posizione completamente diversa nel codice che non ha nulla a che fare con ciò che l'utente stava facendo). Solo se si utilizza Debug Player si ottiene effettivamente la finestra popup con un messaggio di errore e uno stacktrace.
Tuttavia, può essere piuttosto interessante guardare film flash incorporati su determinati siti di notizie e ricevere messaggi ripetuti sui riferimenti Null dal lettore incorporato SWF utilizzato. : D
In C / C ++: che gli incarichi sono anche espressioni COMBINATE CON operatori di assegnazione = e confronto == molto simili. Non è una caratteristica dannosa di per sé, ma è un modo per introdurre facilmente bug (a volte sottili) digitando erroneamente l'operatore.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Modificatori di accesso in Java con impostazione predefinita della lingua privata del pacchetto e impostazione predefinita della convenzione di programmazione privata.
Sostituendo variabili non definite da una stringa vuota in guscio senza avvisi: rm -rf $nosuchvar/*
.
${varname:-/dev/null}
potrebbe essere una soluzione alternativa ...
La possibilità di girare in senso antiorario in LOGO. Wtf, consente solo di ruotare in senso orario 360 - x
.
In Java e in altre lingue è possibile interrompere arbitrariamente un thread da un altro senza dare il tempo necessario per terminare correttamente il thread interrotto. Questa capacità è stata deprecata considerando l'enorme quantità di problemi che potrebbe portare in quasi tutte le situazioni.
Variabili variabili in PHP
Solo perché $can
non intendi te$$should
use strict
) e un modo semplice per riattivarlo esattamente nei casi in cui lo vorresti ( no strict 'refs'
).
La With
dichiarazione in Delphi viene in mente, anche se ci sono casi in cui è utile.
Matrici in AWK a partire dall'indice 1 !
car
! : P
In Perl, il contesto scalare rispetto al contesto elenco può essere complicato. Ha alcuni punti positivi che rendono convenienti alcune operazioni, ma a volte ti imbatti in qualcosa di terribile, come cambiare completamente il significato di un operatore (potenzialmente da una distanza significativa nel codice).
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)
Non è giusto.
(Nasce dal tentativo di creare qualcosa che si comporta in qualche modo come il normale operatore di distanza, in modo da poter dire qualcosa in un ciclo come next if /start_regex/ .. /end_regex/
).
Sintassi di importazione relativa di Python 2.x. Supponiamo di avere un pacchetto x.plugins
che aggiunge il supporto per varie altre librerie per x
. E supponiamo di avere un sqlalchemy
modulo in x.plugins
modo da poter aggiungere il supporto sqlalchemy a x
. Cosa pensi che accadrà se aggiungo la seguente riga a sqlalchemy.py?
import sqlalchemy
La risposta è che il modulo proverà a importare se stesso. Ciò che fa questa sintassi è essenzialmente impossibile importare l'attuale pacchetto sqlalchemy globale. Python 2.5 ha aggiunto un modo per specificare che si tratta di un'importazione relativa:
from . import sqlalchemy
... ma non è fino a Python 3 che la prima sintassi è stata effettivamente eliminata (anche se può essere disabilitata in Python 2.6+ con from __future__ import absolute_import
).
sun.misc.unsafe è il mio preferito in ogni momento; la raccolta di "ne avevamo bisogno per implementare le cose, ma davvero, davvero non credo che dovresti usarlo".
FORTRAN blocchi comuni. Se hai commesso un semplice errore, una parte di un'applicazione potrebbe ostruire i globi di un'altra parte.
FORTRAN assegnato istruzione goto / istruzione alter COBOL. Codice automodificante. Pericolo, avvertimento, mostri di spaghetti volanti !!
Orientamento agli oggetti (da tutte le lingue tipizzate staticamente). Scommetto che questa funzione ha e continuerà a costare molto di più dei puntatori null. L'orientamento agli oggetti è utile solo in un messaggio dinamico che passa la lingua. Quindi dovrebbe essere eliminato anche da linguaggi dinamici come Python (poiché non utilizza il passaggio di messaggi ma la chiamata di subroutine convenzionale).
Gli sviluppatori inesperti fanno affidamento sul fatto che sia abilitato e quindi assumono che tutti gli input dell'utente siano evitati per l'uso in una query SQL o si basano sul fatto che sono disabilitati e quindi sempre sfuggono al loro input.
Quando si presume che sia abilitato e quindi eseguendo il codice su un sistema in cui non lo è, si aprono ampi fori di iniezione SQL.
Se si presume che sia disabilitato e non lo sia, si tradurrà in barre rovesciate effettivamente memorizzate nel DB, causando stringhe brutte / errate.
Inoltre, non esiste un modo estremamente semplice per gestire entrambi i casi: è necessario verificare se è abilitato utilizzando get_magic_quotes_gpc()
e quindi applicare stripslashes()
su tutti i valori negli $_*
array, poiché array_map
non è ricorsivo, è necessaria una funzione personalizzata per questo.
La funzionalità della lingua che consente ai programmatori di scrivere codice non commentato o senza commenti.
uscendo un po 'su un arto qui - funzioni nulle. una funzione fa sempre qualcosa, quindi dovrebbe restituire il risultato o qualche altra informazione riguardo al suo successo o fallimento.
POKE in BASIC ...
Dovrei dire la raccolta dei rifiuti. Non elimina la necessità di pensare alla gestione della memoria, ma elimina la percezione della necessità di pensare alla gestione della memoria, che troppo spesso elimina il pensiero reale, e quindi ottieni enormi porci di risorse e non sai perché. Soprattutto quando il comportamento dei moderni GC generazionali potrebbe essere descritto senza troppa iperbole come "una grande perdita di memoria in base alla progettazione" comunque.
C, e sicuramente C ++: aritmetica del puntatore. Consentire alle persone di convertire numeri interi in indirizzi di memoria richiede problemi.
E forse anche l'accesso non elaborato ai puntatori?
In C ++ hai riferimenti che rendono i puntatori quasi completamente inutili. Per i restanti casi i puntatori intelligenti devono essere considerati obbligatori.
Java dimostra inoltre che è possibile creare un linguaggio di programmazione che utilizza i puntatori senza consentire alle persone di accedere al valore del puntatore stesso.
Oltre ad null
... ma questa è una storia diversa.
for(int i=0;i<SIZE;++i) ++arr[i]
è più lento di for(int*i=arr;i<arr+SIZE;++i)*i++
. Tutto ciò che Java è riuscito a dimostrare è che hai bisogno di un puntatore o non l'hai mai visto sun.misc.Unsafe
? Se non hai bisogno di puntatori, spiega come scrivere una funzione di scambio generica usando Java. (es. int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Per non parlare di tutti i problemi in c / c ++ che avresti se dovessi usare i riferimenti. Come chiamereste una funzione virtuale su una struttura opaca senza puntatori?