STRONG.TYPE.JOIN.ZERO
Comparison of strong type with zero
The STRONG.TYPE family of checkers detects situations in which programmer-enforced strong typing (type-defined abstract types) is broken or ignored, allowing the underlying ANSI type semantics to dominate.
The STRONG.TYPE.JOIN.ZERO checker looks for instances of comparison between a strongly typed value and zero using a binary operator.
In this rule, zero is defined as any zero constant that has not been cast to a strong type. For example, the checker considers the following to be zero:
- 0L
- (int)0
The checker considers the following examples not to be zero:
- (SPEED)0
- (SPEED*)0
Vulnerability and risk
A compiler following the ANSI standard won't report a warning for this sort of issue, as it checks only the underlying types, not the surface, or programmer-defined, types. As a result, it's possible that a logic error can occur.
Vulnerable code example
typedef float Speed;
int main() {
Speed s;
if (s == 0) ;
return 0;
}
Klocwork flags line 5, indicating that a strongly typed value, s, is compared with zero.
Fixed code example
typedef float Speed;
int main() {
Speed s;
if (s == (Speed) 0) ;
return 0;
}
In the fixed code, the comparison is made clearly with two strongly typed values.