Я застрял в конфликте между знаниями AnsiStrings
sprintfmember function and Cppcheck's built-in
sprintf`.
В подобных случаях
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
sprintf
является функцией, но на самом деле вашаAnsiString::sprintf
также является функцией. То, что это функция-член (то, что вы называете методом, хотя такой терминологии не существует в C++), не делает ее не функцией. Ключевым моментом является то, что это неstd::sprintf
(или::sprintf
). - person Lightness Races in Orbit   schedule 05.09.2016AnsiString
плохо спроектирован. Конечно, CppCheck должен быть умнее, но он может сбивать с толку человека. Зачем повторно использовать имяsprintf
и менять его параметры? Глупый. Я предлагаю вам придерживаться только стандартных технологий и хорошо зарекомендовавших себя сторонних библиотек; не ерунда Turbo C++! - person Lightness Races in Orbit   schedule 05.09.2016wrong place to ask
) ну, иногда это не ошибка, а отсутствие документации (или навыков чтения), я ожидал, что переопределенные функции должны быть проблемой для наивных подходов к анализу, но я знаю, что Cppcheck не не проверяйте на упрощенном лексическом уровне, поэтому я поделился своей проблемой здесь, надеясь, что у кого-то уже есть рабочее решение... - person Wolf   schedule 05.09.2016boost::format
ИМХО. Вы получаете преимущества удобочитаемости и автоматического управления памятью. - person Richard Hodges   schedule 05.09.2016