質問

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

役に立ちましたか?

解決

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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top