Подавить неиспользуемые предупреждения для обработчиков событий с автоматической привязкой в ​​Cppcheck

Я использую Cppcheck 1.70 для проверки проектов C++-Builder. Я получаю много предупреждений о стиле, подобных этому

[source\DbgRecMain.cpp:452]: (style) The function 'FormResize' is never used.

Эти функции являются обработчиками событий, которые используются, но не явно из кода C++: они связаны средой выполнения VCL после загрузки соответствующей формы или модуля данных. Естественно, Cppcheck не проверяет файлы DFM, поэтому не может обнаружить ссылки между событиями и определенными там обработчиками.

Некоторые варианты, которые приходят мне в голову

  • Добавление некоторых явных ссылок, но их нужно поддерживать вручную.
  • Подавление всех предупреждений такого рода, но это скроет действительно мертвый код.

Как я могу специально подавить эти предупреждения о явно неиспользуемых обработчиках событий?


person Wolf    schedule 15.09.2015    source источник


Ответы (1)


В документации CppCheck есть глава о подавлении предупреждений/ошибок. В частности, глава 6.2 будет вам полезна, так как вы сможете по мере необходимости подавлять предупреждения об отдельных обработчиках событий:

Глава 6. Подавление

Если вы хотите отфильтровать определенные ошибки, вы можете подавить их.

6.1. Подавление определенного типа ошибки

Вы можете подавить определенные типы ошибок. Формат для такого подавления является одним из:

[error id]:[filename]:[line]
[error id]:[filename2]
[error id]

error id — это идентификатор, который вы хотите подавить. Самый простой способ получить его — использовать флаг командной строки --xml. Скопируйте и вставьте строку id из вывода XML. Это может быть * для подавления всех предупреждений (для указанного файла или файлов).

filename может включать подстановочные знаки * или ?, которые соответствуют любой последовательности символов или любому отдельному символу соответственно. Рекомендуется использовать «/» в качестве разделителя пути во всех операционных системах.

6.1.1. Подавление командной строки

Параметр командной строки --suppress= используется для указания подавления в командной строке. Пример:

cppcheck --suppress=memleak:src/file1.cpp src/

6.1.2. Список подавлений в файле

Вы можете создать файл подавления. Пример:

// suppress memleak and exceptNew errors in the file src/file1.cpp
memleak:src/file1.cpp
exceptNew:src/file1.cpp

// suppress all uninitvar errors in all files
uninitvar

Обратите внимание, что вы можете добавлять пустые строки и комментарии в файл подавлений. Вы можете использовать файл подавления следующим образом:

cppcheck --suppressions-list=suppressions.txt src/

6.2. Встроенные подавления

Подавление также можно добавлять непосредственно в код, добавляя комментарии, содержащие специальные ключевые слова. Прежде чем добавлять такие комментарии, учтите, что читабельность кода немного приносится в жертву.

Этот код обычно генерирует сообщение об ошибке:

void f() {
    char arr[5];
    arr[10] = 0;
}

Результат:

# cppcheck test.c
Checking test.c...
[test.c:3]: (error) Array ’arr[5]’ index 10 out of bounds

Чтобы скрыть сообщение об ошибке, можно добавить комментарий:

void f() {
    char arr[5];

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

Теперь флаг --inline-suppr можно использовать для подавления предупреждения. При вызове cppcheck таким образом не сообщается об ошибке:

cppcheck --inline-suppr test.c

Также см. следующие вопросы для более подробной информации:

Как использовать параметр встроенного фильтра подавления cppcheck для кода C++?

Можно ли включить подавление cppcheck в заголовок функции?

person Remy Lebeau    schedule 15.09.2015
comment
Да, часть RT*M. Вторая часть — отфильтровать файлы DFM и создать список On\w+ = \w+. Вероятно, проще сгенерировать какой-нибудь бессмысленный код, использующий эти обработчики, вместо того, чтобы искать номера строк. - person Wolf; 16.09.2015
comment
Вам не нужны номера строк. Просто поместите соответствующий комментарий cppcheck-suppress непосредственно над каждым обработчиком событий, на который жалуется CppCheck. - person Remy Lebeau; 16.09.2015
comment
Хорошо, это кажется самым прагматичным решением. Я уже использую некоторые встроенные подавления. Я также попробовал подход с псевдоиспользованием кода, который сработал. Но, взглянув на проблему шире, я предпочитаю подавлять проверку unusedFunction для всех файлов форм (через --suppressions-list), потому что я и так делаю их как можно более простыми и короткими. - person Wolf; 17.09.2015
comment
Я должен принять ваш ответ, даже если он не помог мне с моей первоначальной проблемой. Это помогло понять, что я должен был спросить лучше: я старался избегать ручной работы в ответ на обработчики подключения/отключения в IDE, что означает выполнение одного и того же действия дважды. (В таких случаях я неудовлетворен решением и пытаюсь сделать шаг назад, чтобы еще лучше понять свою настоящую проблему. И это заставило меня усомниться в моем понимании модулей, управляемых IDE, например, форм.) - person Wolf; 20.09.2015