Обработка несовместимо перегруженных имен в Cppcheck

Я застрял в конфликте между знаниями AnsiStrings sprintfmember function and Cppcheck's built-insprintf`.

В подобных случаях

const char* name = "X";
int version = 1;

return AnsiString().sprintf("%s.H%02d", name, version); // <-- HERE

Я получаю это предупреждение в графическом интерфейсе Cppcheck

Идентификатор: неправильнопринтфсканфаргнум

Резюме: строка формата sprintf требует 0 параметров, но дается 1.

Сообщение: строка формата sprintf требует 0 параметров, но задан 1.

который показывает, что Cppcheck говорит о sprintf функции, но я использую функцию-член класса VCL AnsiString с тем же именем.

Чтобы избавиться от этого ложного срабатывания, я мог бы использовать

  • встроенное подавление: // cppcheck-suppress wrongPrintfScanfArgNum
  • промежуточная переменная: AnsiString result; result.printf(...); return result;
  • функция sprintf, которая означает ручную обработку буферного пространства.

Но все эти опции работают локально и затрудняют чтение/обслуживание кода.

Как научить Cppcheck различать перегруженные имена?


Правки:

  • Я написал override, но имел в виду перегрузку, это я поправил в текущем тексте.
  • добавлена ​​литеральная инициализация переменных, что важно для name

person Wolf    schedule 05.09.2016    source источник
comment
Возможно, поднять ошибку с фактическим автором инструмента? Это похоже на неправильное место, чтобы спросить.   -  person Lightness Races in Orbit    schedule 05.09.2016
comment
Кстати, редакционная придирка: вы подчеркиваете, что sprintf является функцией, но на самом деле ваша AnsiString::sprintf также является функцией. То, что это функция-член (то, что вы называете методом, хотя такой терминологии не существует в C++), не делает ее не функцией. Ключевым моментом является то, что это не std::sprintf (или ::sprintf).   -  person Lightness Races in Orbit    schedule 05.09.2016
comment
Кроме того, AnsiString плохо спроектирован. Конечно, CppCheck должен быть умнее, но он может сбивать с толку человека. Зачем повторно использовать имя sprintf и менять его параметры? Глупый. Я предлагаю вам придерживаться только стандартных технологий и хорошо зарекомендовавших себя сторонних библиотек; не ерунда Turbo C++!   -  person Lightness Races in Orbit    schedule 05.09.2016
comment
Ха, это странно; Я открыл несколько вкладок с новыми вопросами, а также уведомления о старых вопросах. Прокомментировав здесь, я перешел к следующему в своем списке, за который получил положительный голос. Там я нашел много ваших комментариев и правок за 2014 год :D   -  person Lightness Races in Orbit    schedule 05.09.2016
comment
@LightnessRacesinOrbit (относительно wrong place to ask) ну, иногда это не ошибка, а отсутствие документации (или навыков чтения), я ожидал, что переопределенные функции должны быть проблемой для наивных подходов к анализу, но я знаю, что Cppcheck не не проверяйте на упрощенном лексическом уровне, поэтому я поделился своей проблемой здесь, надеясь, что у кого-то уже есть рабочее решение...   -  person Wolf    schedule 05.09.2016
comment
Отличная альтернатива sprintf в любом виде boost::format ИМХО. Вы получаете преимущества удобочитаемости и автоматического управления памятью.   -  person Richard Hodges    schedule 05.09.2016
comment
Конечно, это не переопределение, а перегрузка. Извините за путаницу.   -  person Wolf    schedule 06.09.2016


Ответы (2)


Интересно.

Да, я согласен, что об этом следует сообщать на странице http://trac.cppcheck.net. Похоже на баги.

Я вижу 2 ошибки.

AST не показывает правильную информацию о типе для AnsiString(), даже когда я добавляю класс AnsiString.

Библиотека не должна соответствовать sprintf в этом коде. Понятно, что вызывается какой-то метод.

person Daniel Marjamäki    schedule 05.09.2016
comment
Это действительно связано с именем sprintf, см. мой ответ/отчет об ошибке - person Wolf; 06.09.2016

Это действительно ошибка.[1] Cppcheck 1.75 умно проверяет строки формата, но, очевидно, только в некоторых случаях, один из которых является вторым параметром каждая функция называется printf, так что проблема не в AnsiString::sprintf, а в каждой альтернативной реализации.


[1] #7726 (Ошибочное срабатывание: строка формата проверяется для каждой функции с именем 'sprintf ') — Cppcheck

person Wolf    schedule 06.09.2016