Ecouter les ainés... ;)
Mala
Membre, Modérateur
Souvent je m'amuse des automatismes presque désuets que m'ont inculqué mes ainés lorsque je débutais et qui me sont restés avec le temps. Et bien voilà une faille qui m'a fait beaucoup rire...
http://www.macg.co/os-x/2014/02/ssl-une-faille-majeure-dans-ios-et-os-x-80069
Spéciale dédicace à ceux qui n'aiment pas utiliser systématiquement des accolades!
Cela me rappelle la fois où un responsable de projet plus expérimenté m'a fait une relecture de code et m'a dit: "Te poses pas de question gamin, quand tu libères une ressource, repasses toujours tes pointeurs à null !".
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je ne mets pas systématiquement des accolades quand il y a une seule ligne dans la condition, sinon on s'en sort plus.
Et puis ça fait gagner du scrolling.
Moi je l'impose dans les Coding Guidelines que j'ai mis en place dans ma boite. Déjà quand tu rajoutes une ligne plus tard et que tu oublies de rajouter l'accolade, ça fait mal, mais en plus le fait de respecter toujours le même standard ça aide à être rigoureux et à la lisibilité.
Je m'impose depuis peu (deux ou trois mois) de mettre des accolades même pour une seule ligne.
Au départ, je ne supportais pas de ne pas en voir, maintenant, je n'en mets pas quand le test est simple et clair.
Sinon, moi ce qui me choque surtout, c'est le GoTo.
L'usage de goto n'est pas totalement débile, ça évite l'imbrication de if à n'en plus finir et ça réduit la complexité des équation. ça évite également une pratique bien plus crade qui consiste à mettre plusieurs return dans un bloc (qui pose de gros soucis de maintenance lorsque on doit modifier les actions faites dans tous les cas avant la fin.
Si vous lisez un peu plus de code C (sécu, audio, réseau...) vous verrez que le goto a des usages cohérent.
La clé c'est "Te pose pas de questions".
J'imagine la scène :
"Là , t'as pas remis ton pointeur à NULL, faut le faire."
"C'est pas la peine, je suis dans le destructeur, il va rien se passer après"
"Te pose pas de questions j'te dis !"
Les bonnes pratiques c'est souvent une question de réflexe.
Aà¯e. Justement j'allais dire que la bonne nouvelle, c'est que personne n'a critiqué le goto.
C'est la différence entre un bon réflexe (repasse toujours les pointeurs à NULL, ça peut pas faire de mal) et un mauvais préjugé : "N'emploie jamais le goto".
En fait, ce n'est pas un mauvais préjugé en soi, c'est utile quand on démarre la programmation, mais à un moment donné, il faut grandir et se faire sa propre opinion.
C'est un peu comme quand tu dis à un enfant : "Ne parle jamais aux étrangers". C'est utile jusqu'à un certain âge, après ça devient problèmatique si à 30 ans tu continues à ne pas parler aux étrangers.
La règle pour le goto, ce serait plutôt : ne jamais l'employer là où une boucle structurée (while, for) peut le remplacer, autrement dit, ne jamais retourner en arrière dans le flot d'exécution avec un goto.
Dans le cas du code SSL buggé, c'est un cas typique où le goto est adapté : une série d'initialisation de resources où la moindre erreur doit résulter dans la libération des ressources acquises.
Le code complet ici :
http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c
Ce qui me choque dans ce code :
-parfois il y a des accolades, parfois non.
-parfois le if est décomposé, parfois non.
par exemple:
Je pense qu'il aurait fallu utiliser une macro pour la vérification des "err", il y en presque 50 !
Cela aurait permet de rajouter un log en plus et éviter les copier/coller.
Un truc du style:
D'un autre côté, planquer un goto dans une macro c'est pas top non plus.
D'autre part, ce que je trouve choquant, c'est qu'une même variable locale ("err") est à la fois employée pour stocker des erreurs intermédiaires et pour stocker le résultat de la fonction de vérification. Dans un code qui est censé faire de la sécurité c'est inacceptable.
Je pense qu'il aurait fallu dédié un paramètre de sortie pour le résultat de la validation.
Cela fait partie de la règle : "ne jamais utiliser la même variable pour dire deux choses de nature différentes"
Ici err (et donc le retour de la fonction) signifie à la fois : tous les appels d'API se sont bien passés et la clé est correcte/incorrecte.
En retour de fonction, on ne sait pas si c'est la clé qui est invalide ou s'il y a eu un autre problème.
Ci-dessous une version avec un paramètre de sortie en plus :
Je ne m'impose pas de mettre des accolades lorsque le if n'a qu'une ligne. Mais, je mets systématiquement les accolades ouvrantes à la verticale des fermantes correspondantes, et comme tout le monde j'utilise les tabulations pour formater mon code. Pas comme tout le monde, je groupe les déclarations des variables locales en tête des routines ou méthodes et je continue à mettre des point-virgule. Cela m'est resté de mon apprentissage du C dans les années 88-90 et je trouve cela plus clair à la lecture.
A part dans des cas particulier (comme les sauts multiples à un traitement d'erreur), j'évite les GOTO.
Je me suis formé au C, seul, en utilisant le K&R et en faisant de multiples erreurs!!
Merci pour l'explication, j'étais aussi resté au stade du "goto c'est le mal".
Mouais. Chacun son truc...
"free hugs", c'est à la fois rigolo et tragique quand on y pense. Pourquoi les câlins auraient-ils besoin d'être gratuits ?
Edit : non pas qu'ils doivent être payants hein ! C'est juste que gratuit, c'est déjà trop cher.
Cadeau.
C'est beau de vous voir parler de sentiments! ;D
Et quand tu te mets un point d'arrêt sur ta ligne [super dealloc], tu vois immédiatement les objets non libérés.