cppcheck не расширяет макрос при проверке кода C?

У меня есть код, как показано ниже, и я использую cppcheck для статического анализа. Я обнаружил, что он не может сообщить нулевой указатель для данных.

#define MY_FREE(p) if(p) {free(p);(p)=NULL;}

for(i=0; i<10; i++)
{
    ret = list_insert(list, data);
    if (1 != ret)
    {
        MY_FREE(data);
    }

    other_process(data->item);
}

Но если я раскрою макрос "MY_FREE" напрямую, это сработает.

for(i=0; i<10; i++)
{
    ret = list_insert(list, data);
    if (1 != ret)
    {
        if(data) {free(data);(data)=NULL;};
    }

    other_process(data->item);
}

Есть ли какая-либо конфигурация, которая может решить эту проблему?


person Jacky    schedule 24.01.2018    source источник


Ответы (1)


Я разработчик Cppcheck. Какой точный код вы тестируете? Cppcheck предупреждает об этом коде:

#define MY_FREE(p) if(p) {free(p);(p)=NULL;}

void f() {
    struct Data *data;
    for(i=0; i<10; i++)
    {
        ret = list_insert(list, data);
        if (1 != ret)
        {
             MY_FREE(data);
        }
        other_process(data->item);
    }
}

Заявленное предупреждение:

[1.c:12]: (предупреждение) Возможное разыменование нулевого указателя: данные

В вашем коде... похоже, что по какой-то причине у нас есть ложные срабатывания.

person Daniel Marjamäki    schedule 24.01.2018
comment
Спасибо за ваш комментарий. Не могли бы вы заменить other_process(data-›item); с other_process0 (данные); other_process1(data-›item); и повторить попытку? - person Jacky; 05.02.2018
comment
Неизвестно, что делает other_process0(data);, он может переназначить data, чтобы он больше не был NULL. Поэтому Cppcheck не предупреждает об этом. - person Daniel Marjamäki; 06.02.2018
comment
Даже если data можно переназначить в other_process0, изменить data в f() невозможно, верно? - person Jacky; 08.02.2018
comment
Почти. other_process0 может быть макросом. Макрос MY_FREE назначает data. Это настолько распространенный шаблон, что мы должны предположить, что это может быть макрос. Если вы добавите объявление функции/макроса для other_process0, вы должны увидеть предупреждение. В любом случае... Я уверен, что есть ошибки, которые Cppcheck должен обнаруживать, но не обнаруживает, и это очень прискорбно. Если вы видите такие ошибки, то я хотел бы знать об этом. Это требует анализа потока данных, и никогда не будет инструмента, который делает это идеально. - person Daniel Marjamäki; 08.02.2018