An article, "Eight C++ programming mistakes the compiler won't catch":
http://pixelstech.net/article/index.php?id=1333893320

Its Reddit thread:
http://www.reddit.com/r/cpp/comments/s0o99/eight_c_programming_mistakes_the_compiler_wont/


Some quotations from the article, valid for D too:

2) Integer division

Many new programmers attempt to do the following:

int nX = 7;
int nY = 2;
float fValue = nX / nY;  // fValue = 3 (not 3.5!)

The underlying assumption here is that nX / nY will result in a
floating point division because the result is being assigned to
a floating point value. However, this is not the case.

GCC with -Wconversion finds that problem, but maybe with too much noise:

int main() {
    float fX = 7.0;
    int nY = 2;
    float fValue = fX / nY;
    return 0;
}

...>gcc -Wconversion test.c -o test
test.c: In function 'main':
test.c:4:5: warning: conversion to 'float' from 'int' may alter its value [-Wconversion]



4) Mixing signed and unsigned values

int nX;
unsigned int nY;

if (nX - nY < 0)
    // do something

GCC with -Wconversion finds it.
There are more interesting cases with mixing short with uint, etc.



6) Side effects in compound expressions or function calls

int foo(int x)
{
return x;
}

int main()
{
    int x = 5;
    std::cout << foo(x) * foo(++x);
}

A good rule of thumb is to put any operator that
causes a side effect in it’s own statement.

Bye,
bearophile

Reply via email to