Twoje przypuszczenie, że kod jest wyciekiem zabezpieczeń, może być lub nie być prawdziwe w zależności od używanego języka . W kodzie C może to być problem (szczególnie dlatego, że w C boolean jest tylko liczbą całkowitą niezerową lub zerową) - ale w najbardziej typowych językach (tj. Sprawdzanie typu środowiska wykonawczego), jeśli passwordCheck
zmienna została zadeklarowana jako boolean, nie ma sposobu, aby przypisać coś innego. W rzeczywistości wszystko w if
predykacie musi zostać przetworzone na wartość logiczną, niezależnie od tego, czy używasz operatorów boolowskich, czy po prostu używasz wartości. Jeśli udało się powiązać inny typ obiektupasswordCheck
środowiskiem wykonawczym, wygenerowałby jakiś rodzaj nielegalnego wyjątku rzutowania.
Proste konstrukcje if / else są znacznie łatwiejsze do odczytania niż konstrukcje if / if - i mniej podatne na nieumyślne problemy, jeśli ktoś spróbuje przerzucić konstrukt. Weźmy ten sam przykład przez sekundę:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Znaczenie wzajemnie wykluczających się klauzul, które chcesz wykonać powyżej, zostało utracone. To właśnie przekazuje konstrukcja if / else. Dwie wzajemnie wykluczające się gałęzie egzekucji, przy czym jedna z nich zawsze będzie działać. Jest to ważna część bezpieczeństwa - upewnienie się, że nie ma sposobu, aby letThemIn
zadzwonić denyAccess
.
W celu zapewnienia przejrzystości kodu oraz w celu zapewnienia największej ochrony sekcji krytycznych powinny one znajdować się w klauzuli podstawowej ( if
części). Domyślne zachowanie niezgodne powinno znajdować się w alternatywnej klauzuli ( else
części). Na przykład:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
UWAGA: pracując z różnymi językami, opracowałem nawyk kodowania, który pomaga uniknąć pytania „co jeśli to ciąg znaków?” Zasadniczo należy umieścić stałą na pierwszym miejscu w wyrażeniu boolowskim. Na przykład zamiast sprawdzaniapasswordCheck == false
sprawdzam false == passwordCheck
. Pozwala to również uniknąć przypadkowego problemu przypisania możliwego w C ++. Przy takim podejściu kompilator będzie narzekał, jeśli piszę =
zamiast ==
. W językach takich jak Java i C # kompilator traktowałby przypisanie w klauzuli if jako błąd, ale C ++ chętnie je zaakceptuje. Dlatego też mam tendencję do sprawdzania wartości zerowej przy null
pierwszym.
Jeśli rutynowo zmieniasz języki, ustawianie stałej jako pierwszej jest bardzo pomocne. Jednak w moim zespole jest to sprzeczne ze standardem kodowania i kompilator i tak wychwytuje te problemy. Przełamanie może być trudne.