Как вызвать предупреждения компилятора 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.

Другие вопросы по тегам