Отслеживание Lint Value на ПК от Gimpel

Я новичок на этом сайте, поэтому, если я испорчу какой-либо из вопросов и правил здесь, я заранее извиняюсь... Спасибо!

Это чрезвычайно упрощенный пример кода, но я думаю, что он показывает то, о чем я говорю: у меня есть метод C++, который делает вызов другого метода для проверки значения...

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;
    }
}

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

Раздражение, которое я испытываю, заключается в том, что отслеживание значений PC Lint игнорирует validNumber() вызывает и выдает предупреждение 661 о возможном доступе за пределы указателя (1 за концом данных) оператором '['

Однако, если я сделаю это так, Линт будет счастлив:

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

Итак, отслеживание значений Lint просто не работает, если тест является вызовом метода?

Еще раз спасибо,

HF

1 ответ

Решение

Я предполагаю, что validNumber определяется после foo, но в любом случае PC Lint обычно делает один проход по коду, и в таких случаях он не видит validNumber как проверку границ для n,

Вы можете попробовать вариант -passes(2) или даже 3и посмотрим, что из этого делает Линт. Я думаю (но не пытался), что Линт тогда правильно заметит, что значение для n находится в правильных пределах.

Другие вопросы по тегам