Отслеживание стоимости пуха ПК от 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


person Harley Freeman    schedule 03.01.2012    source источник


Ответы (1)


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

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

person Johan Bezem    schedule 29.02.2012
comment
Спасибо за предложение! Если мы снова вернемся к этому вопросу, я попробую уловку -passes. На данный момент мы только что закончили # определение действительной проверки, что, конечно, просто ставит все в соответствие, и Lint это нравится - person Harley Freeman; 18.05.2012