Я застрял в «конфликте» между AnsiStrings
Sprintfmember function and Cppcheck's built-in
Спринтф знание.
В таких случаях, как это,
const char* name = "X";
int version = 1;
return AnsiString().sprintf("%s.H%02d", name, version); // <-- HERE
Я получаю это предупреждение в графическом интерфейсе Cppcheck
Идентификатор: неправильныйPrintfScanfArgNum
Сводка: строка формата sprintf требует 0 параметров, но задан 1.
Сообщение: строка формата sprintf требует 0 параметров, но задан 1.
который показывает, что Cppcheck говорит о sprintf
функция, но я использую функция-член класса VCL AnsiString
с тем же именем.
Как избавиться от этого ложного срабатывания, я мог бы использовать
// cppcheck-suppress wrongPrintfScanfArgNum
AnsiString result; result.printf(...); return result;
sprintf
функция, что означает обрабатывать буферное пространство вручнуюНо все эти опции работают локально и затрудняют чтение / сопровождение кода.
Как я могу научить Cppcheck различать перегруженные имена?
Редактирование:
name
Интересно.
Да, я согласен, что об этом следует сообщить в http://trac.cppcheck.net. Похоже, ошибки.
Я вижу 2 ошибки.
AST не показывает правильную информацию о типе для AnsiString (), даже когда я добавляю класс AnsiString.
Библиотека не должна соответствовать sprintf в этом коде. Понятно, что какой-то метод вызывается.
Это действительно ошибка.[1] Cppcheck 1,75 является умный при проверке строк формата, но, очевидно, только в некоторых случаях, одна из них Второй параметр каждой функции называется printf
, так что проблема не имеет ничего общего с AnsiString::sprintf
но с каждой альтернативной реализацией.
[1]
# 7726 (Неверно положительный: строка формата проверяется для каждой функции sprintf) — Cppcheck