0

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

thetic
  • 174
  • 1
  • 11

1 Answers1

0

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.

Johan Bezem
  • 2,582
  • 1
  • 20
  • 47
  • Thanks for the suggestion! If we end up re-visiting this issue I'll try the -passes trick. For now though we just ended up #defining the valid check, which of course just puts it all in line and Lint likes it – Harley Freeman May 18 '12 at 17:08