C++ static analysis
Don
nospam at nospam.com
Fri May 6 05:16:36 PDT 2011
bearophile wrote:
> Through Reddit I've seen another document that shows common little bugs in C/C++ code found by a static analysis tool. The bugs shown seem to be real, from real software:
> http://www.slideshare.net/Andrey_Karpov/add2011-en
>
> From the slides I have selected seven of the bugs, here translated to D2:
>
>
> enum uint FLAG1 = 0b001;
> void main() {
> int x = 1000;
> int y = 1;
> if (!y & x) {} //#1
>
> uint flags;
> if (flags && FLAG1) {} //#2
>
> if (y == 0 || 10 || y) {} //#3
>
> int i;
> for (i = 0; i < 10; i++)
> for (i = 1; i < 5; i++) {} //#4
>
> if (x || x) {} //#5
>
> if (x) y = 1; else y = 1; //#6
>
> auto z = x * y ? 10 : 20; //#7
> }
>
>
> Notes about the bugs:
> - In #1 the programmer meant to write if(!(y & x)). This is often a bug.
I would say that disallowing it would _always_ lead to clearer code. It
should always be rewritten as:
if (!y && x) // wasn't a bug, but was unclear
OR
if (!(y & x)) // was a bug
OR in the one-in-a-million case where the existing code is correct:
if ( (!y) & x ) // wasn't a bug, but even this case is clearer: x MUST
be evaluated
Making #7 an error would break a lot of my code, unless it were done in
a really complicated way (allowing boolean expressions, but not integral
ones other than UnaryExpressions). And that seems quite hard to justify.
But I don't find the other cases convincing. They don't seem any more
likely to be bugs than not. For example, a variation of case #3:
if (1 || y) {}
is common and completely legitimate. Disallowing that would be very
annoying.
More information about the Digitalmars-d
mailing list