Могу ли я включить предупреждения о неправильно используемых спецификаторах для моей собственной функции переменной? - PullRequest
0 голосов
/ 28 февраля 2019

Скажем, если я скомпилирую следующее с использованием компилятора Visual Studio 2017 C ++:

int r = 0;
wprintf_s(L"%s", r);

Это даст мне очень удобные предупреждения:

предупреждение C4477: 'wprintf': строка формата "% s" требует аргумент типа 'wchar_t *', но аргумент 1 переменной имеет тип 'int'

предупреждение C4313: 'wprintf': '% s' в строке формата конфликтует с аргументом 1типа 'int'

Но когда я пытаюсь определить свою собственную переменную функцию:

void MyFormat(_In_z_ _Printf_format_string_ LPCTSTR pszFormat, ...)
{
    va_list argList;
    va_start( argList, pszFormat );

    //Do work ...

    va_end( argList );
}

, а затем вызываем ее аналогичным образом:

int r = 0;
MyFormat(L"%s", r);

Это не вызывает их.

Поэтому мне интересно, могу ли я включить эти предупреждения для своей собственной функции вариации?

1 Ответ

0 голосов
/ 28 февраля 2019

Такие вещи, как _In_z_ и _Printf_format_string_, являются SAL макросами аннотаций.Они распознаются инструментами статического анализа, но препроцессор удаляет их до того, как их увидит компилятор.Таким образом, они не очень полезны в вашей ситуации.

Некоторые сторонние компиляторы реализуют специфичные для поставщика способы, чтобы включить проверку во время компиляции параметров в стиле printf для пользовательских функций (таких как __attribute__(format)и __attribute__(format_arg) в GCC), однако Visual C ++ не является одним из этих компиляторов (см. __ attribute __ ((format (printf, 1, 2))) для MSVC? ).Команда VC ++ решила включить проверки во время компиляции только для стандартных функций среды выполнения семейства C printf/scanf, как описано в их блоге в 2015 году:

Блог команды C ++: проверка спецификаторов формата

По популярному запросу в Visual Studio 2015 RTM, мы реализовали проверку аргументов, заданных для printf / scanf, и их вариаций в стандартной библиотеке C .Вы можете попробовать примеры из этого поста в нашем онлайн-компиляторе .

...

В настоящее время проверка спецификаторов формата выполняется только для предопределенныхнабор функций CRT и недоступен для пользовательских функций, которые также выиграют от аналогичных проверок .Если будет достаточно интереса, мы рассмотрим расширение этих предупреждений для работы с такими пользовательскими функциями.

Если вы действительно хотите проверять во время компиляции пользовательские функции с переменными числами, используйте variadicшаблоны вместо.

...