Подавить несколько предупреждений из одной строки?

У меня есть фрагмент кода, который сводит cppcheck с ума, потому что он не видит переменные, используемые в вызове журнала, как используемые. Итак, я получаю неиспользуемые переменные и предупреждение об уменьшении объема:

    double start = GetTimeOfDayDoubleSec(), afterDb = 0;
    if (LoadFromDatabase(serials)) {
        afterDb = GetTimeOfDayDoubleSec();
        Cache.ResetDebugFlags(serials);
    }
    double end = GetTimeOfDayDoubleSec();
    ZLOG_INFO("DB time  %f, total %f", afterDb ? afterDb - start : 0, end - start);

Cppcheck говорит:

The scope of the variable 'afterDb' can be reduced.
Variable 'afterDb' is assigned a value that is never used.

Я не могу разработать синтаксис для подавления обоих из них, и руководство бесполезно. Отдельная строка, пробелы, запятые, двоеточия и точки с запятой не работают. Отдельные строки дают мне «подавление не соответствует», остальные просто недействительны:

    //cppcheck-suppress variableScope
    //cppcheck-suppress unreadVariable
    //cppcheck-suppress variableScope unreadVariable
    //cppcheck-suppress variableScope,unreadVariable
    //cppcheck-suppress variableScope;unreadVariable
    double afterDb = 0;

 Failed to add suppression. Invalid id "variableScope:unreadVariable"

Позволяет ли cppcheck сделать это встроенно или мне нужно сделать это с помощью XML в командной строке?


панель инструментов cppcheck-gui

Извините, оказалось, что есть непонятная проблема: нажатие «обновить» в cppcheck-gui не обновляет все, мне нужно перезагрузить файл cppcheck, чтобы изменения в подавлении обновлялись. А именно, значок «открыть файл» на панели инструментов, а не справа «обновить».

Оказывается, что пробел работает:

//cppcheck-suppress variableScope unreadVariable

person Code Abominator    schedule 16.02.2015    source источник


Ответы (3)


Чтобы использовать несколько подавлений в одной строке, используйте список с разделителями-запятыми.

Из руководства:

arr[10] = arr[10] / 0; // cppcheck-suppress[arrayIndexOutOfBounds,zerodiv]

Вы также можете складывать подавления:

// cppcheck-suppress arrayIndexOutOfBounds
// cppcheck-suppress zerodiv
arr[10] = arr[10] / 0;
person pixelgrease    schedule 09.07.2020

Разделение пробелом действительно работает:

//cppcheck-suppress variableScope unreadVariable

Это было скрыто из-за того, что нажатие «обновить» в cppcheck-gui на самом деле не обновляет все, мне нужно перезагрузить файл cppcheck.

person Code Abominator    schedule 16.02.2015
comment
Если раньше работало, то больше не работает. Ваш пример дает: Bad suppression attribute 'unreadVariable'. You can write comments in the comment after a ; or //. Valid suppression attributes; symbolName=sym [preprocessorErrorDirective] - person pixelgrease; 09.07.2020
comment
Действительно, больше не работает. Используйте //cppcheck-suppress [variableScope,unreadVariable], как предлагает ответ @pixelgrease - person PJ127; 06.01.2021
comment
Я переключил принятый ответ на соответствие - person Code Abominator; 20.01.2021

Прежде всего... когда я читаю ваш код, мне кажется, что Cppcheck пишет FP. Мы не должны предупреждать об этом коде, не так ли? Я бы хотел, чтобы FP был исправлен. Я скопировал и вставил ваш код и не смог воспроизвести для него FP, поэтому, вероятно, в вашем реальном коде есть что-то, что сбивает с толку Cppcheck.

Код встроенного подавления находится в препроцессоре cppcheck (ищите «cppcheck-suppress» в файле lib/preprocessor.cpp). Насколько я вижу, в настоящее время вы не можете использовать несколько встроенных подавлений.

Если у вас есть время и вы хотите помочь нам, не стесняйтесь:

  • создайте тикет в нашем trac http://trac.cppcheck.net и прикрепите патч, исправляющий это.
  • или создайте запрос на вытягивание в репозитории github http://github.com/danmar/cppcheck, который исправляет это.

Я бы сказал, что встроенные подавления, разделенные пробелами, будут в порядке.

Позволяет ли cppcheck сделать это встроенно или мне нужно сделать это с помощью XML в командной строке?

возможно, это то, что вы имели в виду... но вы можете использовать --suppress или --suppressions-list.

person Daniel Marjamäki    schedule 16.02.2015
comment
Если это поможет, мой код на самом деле оборачивает zlog и скрывает детали (раньше я менял библиотеки журналов, и это раздражает, если вы не переносите макрос), поэтому есть макрос MY_LOG -> макрос dzlog_trace -> extern C dzlog() и единственный файл который на самом деле включает zlog, — это файл заголовка моего журнала (но это заголовок, а не файл c, я не смог так сильно скрыть zlog). - person Code Abominator; 17.02.2015
comment
И посмотрите мое редактирование / ответ: cppcheck уже делает то, что вы предлагаете :) Это означает, что это интуитивное решение (также мое первое предположение, но я тестировал, не зная, что мне нужно перезагрузить файл, а не просто нажать кнопку «Обновить», поэтому он не работал) - person Code Abominator; 17.02.2015