Domanda

, spiegano il motivo per cui e la lista che le lingue hanno le (dis) funzione implementata Per quanto si sa.

Inserisci ciò che si considera una caratteristica nociva, non ciò che non vi piace.

È stato utile?

Soluzione 2

Consenti Null per impostazione predefinita, il "trilioni di" * di dollari errore. Siamo spiacenti Tony Hoare. Quasi ogni lingua disponibile sul pianeta.

Tony Hoare spiega

* Ho regolato l'espressione coniata da Tony Hoare per riflettere perdita effettiva in questi giorni: -)

Altri suggerimenti

Register Globals in PHP

Informazioni: http://php.net/manual/en/security.globals. php

Questo è di gran lunga la caratteristica peggiore da sempre attuata 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

È possibile effettuare le seguenti operazioni:

<?php
echo $value; // return foobar
?>

Durante la lettura del codice, è molto confusa per sapere dove la variabile viene.

Anche se la funzione è abusivo, può portare a buco di sicurezza. Ecco un esempio di codice da php.net che mostra come potrebbe essere male utilizzato:

<?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 e C ++ MACRO. Se mai dovessi vedere un altro errore di compilazione a causa di qualcuno che la scelta di un nome di una funzione standard per la loro macro che si avvita in sul mio codice ho intenzione di urlare. Vediamo l'ultimo incriminato uno:

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

Aaarg! Che cosa hai fatto con il mio STL vettore!?

falltrough di default in C e C ++ istruzioni switch.

conversioni di tipo implicite quando i tipi essendo convertito fra non hanno alcuna relazione evidente. Ad esempio, convertendo un casuale, string non numerico in un int, come in PHP.

goto : anche se ok in rari casi, è più spesso abusato e porta alla difficile leggere i programmi.

NONE

Solo perché una caratteristica viene abusato spesso non lo rende pericoloso.

IMHO l'intero "è considerato nocivo" è il reductio ad hitlerum di la programmazione discussioni lingua.

La maggior parte, se non tutte, le caratteristiche "nocivi" ha, o ha avuto in origine, un caso d'uso molto valido o sono semplicemente metodi di convenienza, in primo luogo. Spetta agli sviluppatori di capire i pro ei contro e il codice di conseguenza.

Se le vostre domande avrebbe dovuto essere qualcosa sulla falsariga di "quale lingua caratteristiche hanno problemi comuni o sfortunati effetti collaterali" la mia risposta sarebbe stata diversa.

[modifica] Per essere chiari: non voglio dire l'utilizzazione ininterrotta di metodi deprecati. Se gli sviluppatori si stanno svalutando / rimozione di una funzione che si dovrebbe usare la sostituzione. Mi riferisco al concetto di che una parte corrente della lingua è considerato nocivo perché alcuni non piace quello che incoraggia o il trade-off coinvolti nel usando che molte persone discutono.

autovivificazione (o altro bind-variabili-on (assegnazione | uso funzione)). È la caratteristica che ho trovato a darmi il maggior numero di bug

PLEASE in INTERCAL. Non lo uso abbastanza, si lamenta. Usalo troppo, si lamenta.

Anche se alcune persone non sono d'accordo con l'uomo o le varie cose che dice, un sacco di Douglas Crockford JavaScript: The Good Parts è fondamentalmente questa domanda applicato a JS. Tra le lamentele di Crockford:

  • portata globale di default per tutto (spettacoli DC come utilizzare la funzione / oggetti come spazi dei nomi e delimitatori portata a disputare questo.)

  • Dichiarazioni come with, il cui comportamento è mancato di definire le cose al namespace globale. (Gah! E 'come il motto JS è se non si riesce, allora non riescono più forte possibile !)

  • Un comportamento imprevisto con l'operatore ==, che richiede in sostanza di utilizzare sempre l'operatore ===.

  • inserimento virgola.

Davvero un bel po 'di JS dovrebbe essere considerato nocivo, forse anche tutto il linguaggio, ma le parti buone sono così maledettamente bene che tipo di costituisce per essa (almeno per me).

"In mancanza di silenzio" in Flash Player come comportamento di default

Ok, non proprio una caratteristica del linguaggio stesso, ma ancora piuttosto strettamente correlati.

Improvvisamente l'applicazione Flash / Flex smette di funzionare e nessuno può dare il minimo accenno ciò che la f * è accaduto. Nessun messaggio di errore, non stacktrace, niente di niente. E 'solo che improvvisamente la transizione schermo non avviene (o avviene in modo completamente sbagliato), o pulsanti non reagiscono ai clic più a lungo, o comboboxes sono vuoti, invece di essere popolato con alcune voci.

Questa "caratteristica" da sola è responsabile di diversi spallucce rapporti e un sacco di capelli grigi mi è stato sempre. -.- Mentre spuntando qualche messaggio criptico nel volto dell'utente non è auspicabile né, si può almeno aiutare lo sviluppatore ottenere il problema risolto.

ma lascia Flash Player si accoltellato nel buio, basandosi sulla descrizione dell'utente (mentre il problema può 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 il lettore di debug che effettivamente ottenere la finestra pop-up con un messaggio di errore e una stacktrace.

Tuttavia, può essere molto interessante per guardare i film in flash incorporato su alcuni siti di notizie e ottenere messaggi ripetuti su Null riferimenti dal lettore SWF incorporato utilizzato. : D

In C / C ++: che le assegnazioni sono anche espressioni combinato con l'incarico molto simile = e di confronto == operatori. Non una caratteristica dannosa di per sé, ma è modo di facile introdurre bug (a volte sottili) da errori di digitazione accidentalmente 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 predefinito pacchetto linguaggio privato e di default convenzione programmazione privato.

Sostituzione variabili non definite da una stringa vuota in guscio senza avvisi:. rm -rf $nosuchvar/*

La capacità di giro in senso antiorario in LOGO. Wtf, lascia basta girare gradi 360 - x in senso orario.

Arresto discussione da un altro thread

In Java e in altra lingua si potrebbe fermare un filo da un altro arbitrariamente senza dare il tempo per la discussione che si è fermato a terminare correttamente. Questa capacità sono stati deprecato considerando l'enorme quantità di problemi che potrebbe portare in quasi tutte le situazioni.

variabili variabili in PHP

Solo perché $can non significa che si $$should

La dichiarazione With in Delphi viene in mente, anche se ci sono casi in cui esso è utile.

Array in AWK a partire da index 1

In Perl, contesto contesto lista vs. scalare può essere difficile. E 'ottenuto alcuni buoni punti che fanno certe operazioni conveniente, ma di tanto in tanto si esegue 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)

Questo è solo scorretto.

(Esso deriva dal tentativo di fare qualcosa che si comporta un po 'come l'operatore di intervallo regolare, in modo da poter dire qualcosa in un ciclo come next if /start_regex/ .. /end_regex/).

relativa sintassi di importazione di Python 2.x. Supponiamo che io sono un x.plugins pacchetto che aggiunge il supporto per diverse altre librerie per x. E supponiamo che ho un modulo di sqlalchemy in x.plugins in modo da poter aggiungere il supporto a SQLAlchemy x. Che cosa pensa accadrà se aggiungere la seguente riga alla sqlalchemy.py?

import sqlalchemy

La risposta è che il modulo cercherà di importare in sé. Ciò che questa sintassi non è essenzialmente rendono impossibile importare il vero e proprio pacchetto di 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 quando Python 3 che la prima sintassi è stato effettivamente deciso di eliminare (anche se può essere disattivata in Python 2.6 + con from __future__ import absolute_import).

sun.misc.unsafe è il mio preferito alltime; la collezione di "avevamo bisogno di questo per implementare le cose, ma in realtà, davvero non credo che si dovrebbe usare."

blocchi comuni FORTRAN. Se hai fatto un semplice errore, una parte di un'applicazione potrebbe clobber globali di un'altra parte.

istruzione goto FORTRAN assegnato / COBOL ALTER. Auto-modificare il codice. Pericolo, avvertimento, Flying Spaghetti mostri !!

Orientamento Object (da tutte le lingue staticamente tipizzati). Scommetto questa caratteristica ha, e continuerà, a costo enormemente più di puntatori nulli. Object Orientation è buono solo in una dinamica di messaggi la lingua. Così dovrebbe essere sceso da linguaggi dinamici come Python troppo (dal momento che non fa uso di message passing, ma convenzionale chiamata subroutine).

magic_quotes in PHP .

Gli sviluppatori PASCAL sia basano su di esso viene attivato e quindi si assumono ogni input dell'utente per essere sfuggito per l'uso in una query SQL o affidamento su di esso essendo disabili e sfuggire quindi sempre il loro contributo.

Quando si ipotizza che è attivato e quindi l'esecuzione del codice in un sistema dove non si apre buchi iniezione SQL larghezza.

Quando ammesso che sia disabilitato e non è, che si tradurrà in backslash essere effettivamente memorizzati nel DB, causando stringhe brutti / errato.

C'è anche modo non estremamente semplice da gestire entrambi i casi - è necessario controllare se è abilitata utilizzando get_magic_quotes_gpc() e quindi applicare stripslashes() su tutti i valori negli array $_* -. Dal array_map non è ricorsiva hai bisogno di una funzione personalizzata per questo

La caratteristica del linguaggio che consente ai programmatori di scrivere codice commentata o privo di senso-ha commentato.

di uscire un po 'su un arto qui - funzioni vuote. una funzione fa sempre qualcosa, quindi si dovrebbe o restituire il risultato o qualche altro po 'di informazioni per quanto riguarda il suo successo o il fallimento.

POKE in BASIC ...

avrei dovuto dire che la raccolta dei rifiuti. Non elimina la necessità di pensare la gestione della memoria, ma elimina il percezione della necessità di pensare la gestione della memoria, che troppo spesso elimina il pensiero attuale, e quindi si ottiene enormi maiali risorse e non so perché. Soprattutto quando il comportamento dei moderni GC generazionale potrebbe essere descritto senza troppo molto iperbole come "una grande perdita di memoria in base alla progettazione" in ogni caso.

C, e sicuramente C ++: L'aritmetica dei puntatori. Permettendo alle persone di interi convertire in indirizzi di memoria è in cerca di guai.

E l'accesso forse anche prima per i puntatori del tutto?

In C ++ si dispone di riferimenti che rende puntatori quasi completamente inutile. Per i restanti casi puntatori intelligenti dovrebbero essere considerati obbligatori.

Java si dimostra anche che si possono fare un linguaggio di programmazione che utilizza i puntatori senza permettere l'accesso alle persone di valore puntatore stesso.

A parte null ... ma questa è un'altra storia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top