When comparing to booleans, we perform magic castings and get unexpected results.
TL;DR: Don't compare against true. Either you are true, or false or you shouldn't compare
The least surprise principle violation.
Fail Fast principle violation
Don't mix booleans with boolean castable objects
Many languages cast values to boolean crossing domains.
#!/bin/bash if [ false ]; then echo "True" else echo "False" fi # this evaluates to true since # "false" is a non-empty string if [ false ] = true; then echo "True" else echo "False" fi # this also evaluates to true
#!/bin/bash if false ; then echo "True" else echo "False" fi # this evaluates to false
Linters can check for explicit comparisons and warnings.
It is a common industry practice to use many non booleans as booleans.
We should be very strict when using booleans.
If it doesn’t work, it doesn’t matter how fast it doesn’t work.
This article is part of the CodeSmell Series.