Votre supposition que le code soit une fuite de sécurité peut ou non être vraie selon la langue que vous utilisez. Dans le code C, cela pourrait être un problème (en particulier parce qu'en C, un booléen est juste un entier non nul ou nul) - mais dans la plupart des langages fortement typés (c'est-à-dire la vérification du type d'exécution) si la passwordCheck
variable a été déclarée comme booléenne, il n'y a aucun moyen de lui attribuer autre chose. En fait, tout dans un if
prédicat doit se résoudre en booléen, que vous utilisiez les opérateurs booléens ou que vous utilisiez simplement la valeur. Si vous parvenez à avoir un autre type d'objet lié au passwordCheck
runtime, cela lèverait un certain type d'exception de conversion illégale.
Les constructions if / else simples sont beaucoup plus faciles à lire que les constructions if / if - et moins sujettes à des problèmes par inadvertance si quelqu'un essaie de retourner la construction. Prenons le même exemple pendant une seconde:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
La signification des clauses mutuellement exclusives que vous souhaitez exécuter ci-dessus est perdue. C'est ce que la construction if / else transmet. Deux branches d'exécution mutuellement exclusives, où l'une d'elles s'exécutera toujours. Il s'agit d'un élément important de la sécurité: il n'y a aucun moyen de le faire letThemIn
après avoir appelé denyAccess
.
Pour des raisons de clarté du code et pour garantir que les sections critiques sont les mieux protégées, elles doivent se trouver à l'intérieur de la clause primaire (la if
partie). Le comportement non conforme par défaut doit se trouver dans la clause alternative (la else
partie). Par exemple:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
REMARQUE: en travaillant avec différentes langues, j'ai développé un habbit de codage qui permet d'éviter la question "et si c'est une chaîne?" Il s'agit essentiellement de mettre la constante en premier dans l'expression booléenne. Par exemple, au lieu de vérifier, passwordCheck == false
je vérifie false == passwordCheck
. Cela évite également le problème d'affectation accidentelle possible en C ++. En utilisant cette approche, le compilateur se plaindra si je tape à la =
place de ==
. Dans des langages comme Java et C #, le compilateur traiterait l'affectation dans la clause if comme une erreur, mais C ++ l'acceptera volontiers. C'est pourquoi j'ai également tendance à faire une vérification nulle avec le null
premier.
Si vous changez régulièrement de langue, placer la constante en premier est très utile. Cependant, dans mon équipe, il est opposé à la norme de codage et le compilateur détecte de toute façon ces problèmes. Cela peut être difficile à briser.