Question

S'il vous plaît, vous expliquer pourquoi et liste les langues ont la (mauvaise) En ce qui a mis en œuvre fonctionnalité vous le savez.

Poster ce que vous considérez comme un élément nuisible, pas ce que vous détestez.

Était-ce utile?

La solution 2

Autoriser Null par défaut, le « billion » * erreur de dollars. Désolé Tony Hoare. Presque toutes les langues disponibles sur la planète.

Tony Hoare explique

* I ajusté l'expression inventée par Tony Hoare pour refléter la perte réelle de ces jours-ci: -)

Autres conseils

Globals en PHP enregistrer

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

Ceci est de loin le pire aspect à jamais mis en œuvre pour des raisons de lisibilité et des raisons de sécurité. Basiquement tous les paramètres GET reçues sont transformées en variables.

Par exemple avec cette URL: /index.php?value=foobar

Vous pouvez faire ce qui suit:

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

Lorsque vous lisez le code, il est très difficile de savoir où la variable vient.

De plus, si la fonction est mal utilisée, elle peut conduire à trou de sécurité. Voici un exemple de code de php.net qui montre comment il peut être mal utilisés:

<?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 et C ++ macros. Si je dois jamais voir une autre erreur du compilateur en raison de quelqu'un de choisir un nom de fonction standard pour leur macro qui se visse mon code, je vais crier. Voyons voir le dernier incriminé:

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

Aaarg! Qu'avez-vous fait avec mon vecteur STL!?

fallthrough par défaut dans les instructions switch de C et C.

conversions de type implicites lorsque les types sont convertis entre ont pas de relation évidente. Par exemple, la conversion d'un aléatoire, string non numérique en un int, comme en PHP.

goto : ok, bien que dans de rares cas, il est plus souvent mal utilisé et conduit à difficile à lire des programmes.

NONE

Juste parce qu'un

fonction se mal utilisé ne fréquemment rend pas nocif.

à mon humble avis l'ensemble "est considéré comme dangereux" est le reductio ad hitlerum de la programmation des discussions linguistiques.

La plupart, sinon la totalité, des caractéristiques « nuisibles » ont, ou avaient à l'origine, un cas d'utilisation très valide ou sont tout simplement des méthodes pratiques en premier lieu. Il appartient aux développeurs de comprendre les avantages et les inconvénients et le code en conséquence.

Si vos questions devait être quelque chose le long des lignes de « quelles sont les caractéristiques linguistiques ont pièges ou des effets secondaires malheureux » ma réponse serait différente.

[modifier] Pour être clair: Je ne veux pas dire l'utilisation continue des méthodes dépréciées. Si les développeurs se déprécient / suppression d'une fonction, vous devez utiliser le remplacement. Je me réfère à une partie concept actuel de la langue est considérée comme nuisible parce que certains ne le font pas comme ce qu'il encourage ou trade-off engagé dans son utilisation que beaucoup de gens discutent.

autovivification (ou autre-on-bind variable (assign | fonction de l'utilisation)). Est la fonction que j'ai trouvé pour me donner le plus de bugs

PLEASE dans INTERCAL. Ne pas utiliser assez, il se plaint. Utilisez trop, il se plaint.

Bien que certaines personnes sont en désaccord avec l'homme ou diverses choses qu'il dit, beaucoup de Douglas Crockford JavaScript: The Good Parts est essentiellement cette question appliquée à JS. Parmi les plaintes de Crockford:

  • portée mondiale par défaut pour tout (dc montre comment utiliser la fonction / objets comme espaces de noms et délimiteurs portée à ce bras de fer dans.)

  • Des déclarations comme with, dont le comportement l'échec est de définir les choses à l'espace de noms global. (Gah! Son comme la devise JS est si vous échouez, puis ne parviennent pas aussi dur que possible !)

  • Comportement inattendu avec l'opérateur ==, qui vous oblige essentiellement à toujours utiliser l'opérateur ===.

  • insertion virgule.

Vraiment beaucoup de JS devrait être considéré comme nocif, peut-être même tout le langage, mais les bonnes parties sont tellement bon darn que ce genre de fait pour elle (au moins pour moi.)

"défaut en silence" dans Flash Player comme comportement par défaut

Ok, pas vraiment une caractéristique de la langue elle-même, mais encore assez étroitement liée.

Soudain, votre application Flash / Flex cesse de fonctionner et que personne ne peut vous donner la moindre indication que le f * est arrivé. Aucun message d'erreur, pas stacktrace, rien. Il est juste que soudainement la transition de l'écran ne se produit pas (ou se produit dans une manière complètement faux), ou les boutons ne réagissent pas aux clics plus longtemps, ou comboboxes sont vides au lieu d'être remplies avec quelques entrées.

Cette « fonctionnalité » est seul responsable de plusieurs haussement rapports et tout un tas de cheveux gris je reçois. Alors que -.- apparaître un certain message cryptique dans le visage de l'utilisateur n'est pas souhaitable non plus, il peut au moins aider le développeur à obtenir le problème résolu.

Flash Player vous laisse coups de couteau dans l'obscurité, en se fondant sur la description de l'utilisateur (alors que le problème peut effectivement provenir d'un emplacement complètement différent dans le code qui n'a rien à voir avec ce que l'utilisateur a fait). Seulement si vous utilisez le lecteur de débogage vous obtenez en fait la fenêtre avec un message d'erreur et un stacktrace.

Cependant, il peut être intéressant de regarder des films flash embarqués sur certains sites d'information et d'obtenir des messages répétés sur les références Null du lecteur intégré utilisé SWF. : D

En C / C ++: Ce sont aussi des expressions missions COMBINES l'affectation très similaire = et comparaison == opérateurs. Pas une caractéristique nocive en soi, mais il est moyen d'insectes facile d'introduire (parfois subtiles) par mistyping accidentellement l'opérateur.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

modificateurs d'accès en Java avec défaut de langue privée paquet et par défaut de convention de programmation privée.

Remplacement des variables non définies par une chaîne vide dans la coquille sans aucun avertissement. rm -rf $nosuchvar/*

La possibilité de tourner vers la gauche dans LOGO. Wtf, permet de tourner dans le sens horaire juste degrés 360 - x.

Arrêt fil à partir d'un autre thread

En Java et dans d'autres langues que vous pourriez arrêter un fil d'une autre manière arbitraire, sans donner le temps au fil que vous arrêté pour terminer correctement. Cette capacité a été désapprouvée compte tenu de l'énorme quantité de problème, il pourrait apporter dans presque toutes les situations.

Variables variables en PHP

Juste parce que vous $can ne signifie pas que vous $$should

La déclaration de With en Delphi vient à l'esprit, bien qu'il y ait des cas quand elle est en USEFULL.

Les tableaux dans AWK à partir de l'index 1

En Perl, un contexte scalaire par rapport à un contexte de liste peut être difficile. Il a obtenu quelques bons points qui rendent certaines opérations pratiques, mais parfois vous rencontrez quelque chose de terrible, comme changer complètement le sens d'un opérateur (potentiellement d'une distance importante dans le code).

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)

C'est tout simplement pas droit.

(Il se pose d'essayer de faire quelque chose qui agit un peu comme l'opérateur d'intervalle régulier, de sorte que vous pouvez dire quelque chose dans une boucle comme next if /start_regex/ .. /end_regex/).

syntaxe relative des importations de Python 2.x. Supposons que j'ai un x.plugins paquet qui ajoute le support pour diverses autres bibliothèques pour x. Et si j'ai un module sqlalchemy dans x.plugins pour que je puisse ajouter le support sqlalchemy à x. Que pensez-vous qui va se passer si j'ajoute la ligne suivante à sqlalchemy.py?

import sqlalchemy

La réponse est que le module essaiera de lui-même importer. Qu'est-ce que cette syntaxe n'est essentiellement rendre impossible d'importer le paquet sqlalchemy global réel. Python 2.5 a ajouté un moyen de spécifier que c'est une importation relative:

from . import sqlalchemy

... mais ce n'est que Python 3 que la première syntaxe a été effectivement réussi à se débarrasser de (bien qu'il puisse être désactivé en Python 2.6+ avec from __future__ import absolute_import).

sun.misc.unsafe est mon favori alltime; la collection de « nous avions besoin pour mettre en œuvre cette choses, mais vraiment, ne pense vraiment pas que vous devriez l'utiliser. »

Fortran blocs communs. Si vous avez fait une simple erreur, une partie d'une application pourrait écraserait les GLOBALS d'une autre partie.

FORTRAN affecté goto / COBOL déclaration alter. Code automodifiant. Danger, avertissement, monstres de spaghettis volant !!

Orientation de l'objet (de toutes les langues statiquement typé). Je vais miser cette fonction a, et continuera, à coût largement Plus que les pointeurs nuls. Orientation objet est seulement bon dans une dynamique envoi de messages langue. Il doit donc être passé de langages dynamiques comme Python aussi (car il n'utilise pas le passage de messages, mais les appels de sous-programme classique).

magic_quotes en PHP .

Les développeurs inexpérimentée soit qu'il se présente activé et supposent donc toutes les entrées utilisateur à échapper pour une utilisation dans une requête SQL ou en dépendent être désactivé et donc toujours échapper à leur entrée.

en supposant qu'il est activé, puis exécuter le code sur un système où ce n'est pas elle ouvre des trous béants larges d'injection SQL.

en supposant qu'il est désactivé et ce n'est pas, cela se traduira par des barres obliques inverses étant effectivement stockées dans la base de données, ce qui provoque des chaînes laides / incorrectes.

Il n'y a également aucun moyen extrêmement simple à manipuler les deux cas - vous devez vérifier si elle est activée à l'aide get_magic_quotes_gpc() et appliquer ensuite stripslashes() sur toutes les valeurs dans les tableaux de $_* -. Depuis array_map ne vous récursif avez besoin d'une fonction personnalisée pour cette

La fonction de langage qui permet aux programmeurs d'écrire du code décommentée ou commenté vide de sens.

sortir un peu sur un membre ici - fonctions vides. une fonction fait toujours quelque chose, il devrait donc soit renvoyer le résultat ou un autre bit d'information au sujet de son succès ou de l'échec.

POKE en BASIC ...

Je dois dire que la collecte des ordures. Il ne supprime pas la nécessité de penser à la gestion de la mémoire, mais il élimine le la perception de la nécessité de penser à la gestion de la mémoire, ce qui élimine trop souvent la pensée réelle, et vous obtenez d'énormes porcs de ressources et ne sais pas pourquoi. Surtout quand le comportement des générations modernes GCS pourrait être décrit sans trop beaucoup hyperbole comme « une grande fuite de mémoire par la conception » de toute façon.

C, et certainement C ++: pointeur arithmétique. Permettre aux gens de entiers convertir en adresses de mémoire est d'avoir des ennuis.

Et peut-être même un accès brut à des pointeurs au total?

En C ++, vous avez des références qui fait des pointeurs presque complètement inutile. Pour les autres cas des pointeurs intelligents devraient être considérés comme obligatoires.

Java est prouve également que vous peut faire un langage de programmation qui utilise des pointeurs sans autoriser l'accès à la valeur du pointeur lui-même.

En dehors de null ... mais c'est une autre histoire.

Licencié sous: CC-BY-SA avec attribution
scroll top