Search code examples
lintpc-lint

Gimpel's PC Lint Value Tracking


I'm a newbie to this site, so if I mess up any question-asking etiquette here I apologize in advance... Thanks!

This is extremely simplified example code, but I think it shows what I'm talking about: I have a C++ method that makes a call into another method to test a value...

char m_array[MAX]; // class member, MAX is a #define

foo(unsigned int n)
{
    if (validNumber(n)) //test n
    {
        // do stuff
        m_array[n-1] = 0;
    }
}

where: validNumber(unsigned int val) { return ((val > 0) && (val <= MAX)); }

The irritation I'm having is that PC Lint's Value Tracking seems to ignore the validNumber() call and gives a warning 661 possible access of out-of-bounds pointer (1 beyond end of data) by operator '['

However if I do it like this, Lint is happy:

if ((n > 0) && (n <= MAX)) //test n
...

So, does Lint's Value Tracking just not work if the test is a method call?

Thanks again,

HF


Solution

  • I'd guess that validNumber is defined after foo, but in any case, PC Lint normally makes one pass over the code, and in such cases it doesn't see validNumber as a check for the boundaries for n.

    You could try the option -passes(2) or even 3, and see what Lint makes out of it. I think (but didn't try) that Lint would then correctly note that the value for n is within the correct bounds.