Как вызвать предупреждения компилятора SAL в моем собственном коде с помощью Visual C++ без выполнения статического анализа кода
Если я создам новый консольный проект в VS 2019 и добавлю свою собственную аннотированную реализацию и вызову как настоящую, так и свою версию:
// SALTest.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <cstdarg>
int my_printf(_In_z_ _Printf_format_string_ char const* const format, ...)
{
va_list arglist;
va_start(arglist, format);
int result = _vfprintf_l(stdout, format, nullptr, arglist);
va_end(arglist);
return result;
}
int main()
{
printf("Hello World!\n");
printf("printf good: %s\n", "narrow string");
printf("printf bad: %s\n", L"wide string");
my_printf("my_printf good: %s\n", "narrow string");
my_printf("my_printf bad: %s\n", L"wide string");
}
Когда я компилирую файл, я вижу предупреждение компилятора о неправильном использовании, но не о неправильном использовании:
Теперь это правда, что я могу «запустить анализ кода в файле (Ctrl+Shift+Alt+F7)», и это даст мне предупреждения анализа кода для printf и my_printf в дополнение к исходному предупреждению компилятора для printf:
1>------ Build started: Project: SALTest, Configuration: Debug Win32 ------
1>SALTest.cpp
1>C:\Code\SALTest\SALTest.cpp(21,12): warning C4477: 'printf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'const wchar_t *'
...
C:\Code\SALTest\SALTest.cpp(21): warning C6303: Format string mismatch: wide character string passed as _Param_(2) when character string is required in call to 'printf' Actual type: 'const wchar_t [12]'.
C:\Code\SALTest\SALTest.cpp(23): warning C6303: Format string mismatch: wide character string passed as _Param_(2) when character string is required in call to 'my_printf' Actual type: 'const wchar_t [12]'.
Но у меня такой вопрос: можно ли получить такое же предупреждение компилятора для
1 ответ
Аннотации SAL не имеют никакого эффекта на этапе компиляции, поскольку они реализованы как пустые макросы препроцессора. Они влияют только на инструменты статического анализа.
В случае
printf()
(и другие подобные стандартные функции, например
scanf()
) современные компиляторы обладают встроенными знаниями о требованиях к своим параметрам и, таким образом, могут проверять значения параметров, предоставленные пользователем, во время компиляции. Но это расширение компилятора, не определенное стандартами C / C++.
Например, gcc и clang предлагают проверку во время компиляции
printf
-стайл пользовательской функции, украсив ее
__attribute__((format(...)))
, но в настоящее время MSVCне поддерживает эту функцию , он поддерживает только аннотации SAL.