Поделиться через


Использование средств проверки на соответствие C++ Core Guidelines

Основные рекомендации по C++ — это переносимый набор рекомендаций, правил и рекомендаций по написанию кода в C++, созданных экспертами и конструкторами C++. Visual Studio в настоящее время поддерживает подмножество этих правил в рамках средств анализа кода для C++. Основные средства проверки руководства устанавливаются по умолчанию в Visual Studio 2017 и Visual Studio 2019. Они доступны в виде пакета NuGet для Visual Studio 2015.

Проект основных рекомендаций C++

Созданные Bjarne Stroustrup и другие, основные рекомендации по C++ — это руководство по использованию современных C++ безопасно и эффективно. В рекомендациях подчеркивается безопасность статических типов и безопасность ресурсов. Они определяют способы устранения или минимизации наиболее подверженных ошибкам частей языка. Они также предлагают, как упростить код, повысить надежность и повысить производительность. Эти рекомендации поддерживаются Фондом C++ уровня "Стандартный". Дополнительные сведения см. в документации по основным рекомендациям C++ и доступ к файлам проекта проекта документации по основным рекомендациям C++ на сайте GitHub.

Включение рекомендаций по проверке ядра C++ в анализе кода

Подмножество правил проверки ядра C++ включается в набор рекомендуемых правил Microsoft Native. Это набор правил, который выполняется по умолчанию при включенном анализе кода.

Включение анализа кода в проекте

  1. Откройте диалоговое окно "Страницы свойств" для проекта.

  2. Выберите страницу свойства>анализа кода конфигурации.

  3. Установите флажок "Включить анализ кода в сборке".

Страница свойств для общих параметров анализа кода.

Чтобы включить дополнительные правила проверки ядра, откройте раскрывающийся список и выберите наборы правил, которые необходимо включить:

Раскрывающийся список для дополнительных наборов правил проверки ядра C++ .

Подмножество правил проверки ядра C++ включается в набор рекомендуемых правил Microsoft Native. Это набор правил, который выполняется по умолчанию при включенном анализе кода Майкрософт.

Чтобы включить анализ кода в проекте, выполните следующее:

  1. Откройте диалоговое окно "Страницы свойств" для проекта.

  2. Выберите страницу свойства>анализа кода конфигурации.

  3. Задайте свойства "Включить анализ кода для сборки" и "Включить анализ кода Майкрософт".

Вы также можете запустить все поддерживаемые правила проверки ядра C++ или выбрать собственный подмножество для выполнения:

Включение дополнительных правил проверки ядра

  1. Откройте диалоговое окно "Страницы свойств" для проекта.

  2. Выберите страницу свойств>кода конфигурации Analysis>Microsoft.

  3. Откройте раскрывающийся список "Активные правила" и выберите " Выбрать несколько наборов правил".

  4. В диалоговом окне "Добавление или удаление наборов правил" выберите наборы правил, которые необходимо включить.

Примеры

Ниже приведен пример некоторых проблем, которые могут найти правила проверки ядра C++:

// CoreCheckExample.cpp
// Add CppCoreCheck package and enable code analysis in build for warnings.

int main()
{
    int arr[10];           // warning C26494
    int* p = arr;          // warning C26485

    [[gsl::suppress(bounds.1)]] // This attribute suppresses Bounds rule #1
    {
        int* q = p + 1;    // warning C26481 (suppressed)
        p = q++;           // warning C26481 (suppressed)
    }

    return 0;
}

В этом примере показано несколько предупреждений, которые могут найти правила проверки ядра C++:

  • C26494 — правило Type.5: всегда инициализировать объект.

  • C26485 — это правило Bounds.3: нет распада массива к указателю.

  • C26481 — это правило Bounds.1: не используйте арифметический указатель. Вместо этого используйте span.

Установите и включите наборы правил анализа кода C++ Core, а затем скомпилируйте этот код. Анализ кода выводит первые два предупреждения и подавляет третий. Ниже приведены выходные данные сборки из примера кода в Visual Studio 2015:

1>------ Build started: Project: CoreCheckExample, Configuration: Debug Win32 ------
1>  CoreCheckExample.cpp
1>  CoreCheckExample.vcxproj -> C:\Users\username\documents\visual studio 2015\Projects\CoreCheckExample\Debug\CoreCheckExample.exe
1>  CoreCheckExample.vcxproj -> C:\Users\username\documents\visual studio 2015\Projects\CoreCheckExample\Debug\CoreCheckExample.pdb (Full PDB)
c:\users\username\documents\visual studio 2015\projects\corecheckexample\corecheckexample\corecheckexample.cpp(6): warning C26494: Variable 'arr' is uninitialized. Always initialize an object. (type.5: http://go.microsoft.com/fwlink/p/?LinkID=620421)
c:\users\username\documents\visual studio 2015\projects\corecheckexample\corecheckexample\corecheckexample.cpp(7): warning C26485: Expression 'arr': No array to pointer decay. (bounds.3: http://go.microsoft.com/fwlink/p/?LinkID=620415)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Основные рекомендации по C++ помогут вам создать более безопасный и более безопасный код. Однако вы можете найти экземпляр, в котором не следует применять правило или профиль. Его легко отключить непосредственно в коде. Атрибут можно использовать [[gsl::suppress]] для проверки ядра C++ от обнаружения и создания отчетов о нарушении правила в следующем блоке кода. Вы можете пометить отдельные инструкции для подавления определенных правил. Вы даже можете отключить весь профиль границ, записав [[gsl::suppress(bounds)]] без включения определенного номера правила.

Поддерживаемые наборы правил

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

15.3 Эти правила впервые появились в Visual Studio 2017 версии 15.3
15.5 Эти правила впервые появились в Visual Studio 2017 версии 15.5
15.6 Эти правила впервые появились в Visual Studio 2017 версии 15.6
15.7 Эти правила впервые появились в Visual Studio 2017 версии 15.7
16.0 Эти правила впервые появились в Visual Studio 2019 версии 16.0
16.3 Эти правила впервые появились в Visual Studio 2019 версии 16.3

Вы можете ограничить предупреждения только одним или несколькими группами. Наборы правил "Собственный минимальный" и "Собственный рекомендуемый код" включают правила проверки ядра C++ и другие проверки PREfast.

Чтобы просмотреть доступные наборы правил, откройте диалоговое окно "Свойства проекта". В диалоговом окне "Страницы свойств" выберите страницу общего свойства анализа> кода конфигурации.> Затем откройте раскрывающийся список в поле со списком "Наборы правил", чтобы просмотреть доступные наборы правил. Чтобы создать настраиваемое сочетание наборов правил, выберите " Выбрать несколько наборов правил". В диалоговом окне "Добавление или удаление наборов правил" перечислены правила, которые можно выбрать. Дополнительные сведения об использовании наборов правил в Visual Studio см. в разделе "Использование наборов правил", чтобы указать правила C++ для выполнения.

Чтобы просмотреть доступные наборы правил, откройте диалоговое окно "Свойства проекта". В диалоговом окне "Страницы свойств" выберите страницу свойств>кода конфигурации Для анализа>свойств Майкрософт. Затем откройте раскрывающийся список в списке "Активные правила" , чтобы просмотреть доступные наборы правил. Чтобы создать настраиваемое сочетание наборов правил, выберите " Выбрать несколько наборов правил". В диалоговом окне "Добавление или удаление наборов правил" перечислены правила, которые можно выбрать. Дополнительные сведения об использовании наборов правил в Visual Studio см. в разделе "Использование наборов правил", чтобы указать правила C++ для выполнения.

Макросы

Средство проверки основных рекомендаций C++ поставляется с файлом заголовка, который определяет макросы, которые упрощают подавление целых категорий предупреждений в коде:

ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS

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

#include <CppCoreCheck\Warnings.h>
#pragma warning(disable: ALL_CPPCORECHECK_WARNINGS)
#pragma warning(default: CPPCORECHECK_CONST_WARNINGS)

Атрибуты

Компилятор Microsoft C++ имеет ограниченную поддержку атрибута [[gsl::suppress]] . Его можно использовать для подавления предупреждений о выражениях и блоках инструкций внутри функций.

// Suppress only warnings from the 'r.11' rule in expression.
[[gsl::suppress(r.11)]] new int;

// Suppress all warnings from the 'r' rule group (resource management) in block.
[[gsl::suppress(r)]]
{
    new int;
}

// Suppress only one specific warning number.
// For declarations, you might need to use the surrounding block.
// Macros are not expanded inside of attributes.
// Use plain numbers instead of macros from the warnings.h.
[[gsl::suppress(26400)]]
{
    int *p = new int;
}

Подавление анализа с помощью параметров командной строки

Вместо #pragmas можно использовать параметры командной строки на странице свойств файла для подавления предупреждений для проекта или одного файла. Например, чтобы отключить предупреждение C26400 для файла:

  1. Щелкните правой кнопкой мыши файл в Обозреватель решений и выберите "Свойства".

  2. В диалоговом окне "Страницы свойств" выберите страницу свойств>конфигурации C/C++>Command Line.

  3. В поле "Дополнительные параметры" добавьте/wd26400.

С помощью параметра командной строки можно временно отключить весь анализ кода для файла, указав /analyze-. Вы увидите предупреждение D9025, переопределяющее "/анализ" с помощью "/analysis-", которое напоминает вам повторно включить анализ кода позже.

Включение средства проверки основных рекомендаций C++ для определенных файлов проекта

Иногда полезно выполнять анализ кода и по-прежнему использовать интегрированную среду разработки Visual Studio. Попробуйте выполнить следующий пример сценария для крупных проектов. Он может сэкономить время сборки и упростить фильтрацию результатов:

  1. В командной esp.extension оболочке задайте переменную среды.

  2. Чтобы наследовать эту переменную, откройте Visual Studio из командной оболочки.

  3. Загрузите проект и откройте его свойства.

  4. Включите анализ кода, выберите соответствующие наборы правил, но не включите расширения анализа кода.

  5. Перейдите к файлу, который нужно проанализировать с помощью средства проверки основных рекомендаций C++ и откройте его свойства.

  6. Выберите свойства>конфигурации C/C++>Command Line>Дополнительные параметры и добавьте/analyze:plugin EspXEngine.dll

  7. Отключите использование предварительно скомпилированного заголовка (свойства>конфигурации C/C++>Предварительно скомпилированные заголовки). Это необходимо, так как подсистема расширений может попытаться прочитать внутреннюю информацию из предварительно скомпилированного заголовка (PCH). Если PCH был скомпилирован с параметрами проекта по умолчанию, он не будет совместим.

  8. Выполните повторную сборку проекта. Общие проверки PREFast должны выполняться во всех файлах. Так как средство проверки основных рекомендаций C++ по умолчанию не включено, он должен запускаться только в файле, настроенном для его использования.

Использование средства проверки основных рекомендаций C++ за пределами Visual Studio

Вы можете использовать проверки основных рекомендаций C++ в автоматизированных сборках.

MSBuild

Средство проверки анализа машинного кода (PREfast) интегрировано в среду MSBuild с помощью пользовательских целевых файлов. Свойства проекта можно использовать для включения и добавления средства проверки основных рекомендаций C++ (который основан на PREfast):

  <PropertyGroup>
    <EnableCppCoreCheck>true</EnableCppCoreCheck>
    <CodeAnalysisRuleSet>CppCoreCheckRules.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>

Перед импортом Microsoft.Cpp.targets файла добавьте эти свойства. Можно выбрать определенные наборы правил или создать настраиваемый набор правил. Кроме того, используйте набор правил по умолчанию, включающий другие проверки PREfast.

Средство проверки ядра C++ можно запускать только в указанных файлах. Используйте тот же подход, что и описано ранее, но используйте файлы MSBuild. Переменные среды можно задать с помощью BuildMacro элемента:

<ItemGroup>
    <BuildMacro Include="Esp_Extensions">
      <EnvironmentVariable>true</EnvironmentVariable>
      <Value>CppCoreCheck.dll</Value>
    </BuildMacro>
</ItemGroup>

Если вы не хотите изменять файл проекта, можно передать свойства в командной строке:

msbuild /p:EnableCppCoreCheck=true /p:RunCodeAnalysis=true /p:CodeAnalysisRuleSet=CppCoreCheckRules.ruleset ...

Проекты, отличные от MSBuild

Если вы используете систему сборки, которая не зависит от MSBuild, вы по-прежнему можете запустить средство проверки. Чтобы использовать его, необходимо ознакомиться с некоторыми внутренними компонентами конфигурации подсистемы анализа кода. Мы не гарантируем поддержку этих внутренних элементов в будущих версиях Visual Studio.

Анализ кода требует нескольких переменных среды и параметров командной строки компилятора. Мы рекомендуем использовать среду командной строки собственных средств, поэтому вам не нужно искать определенные пути для компилятора, включать каталоги и т. д.

  • Переменные среды

    • set esp.extensions=cppcorecheck.dll Это указывает подсистеме загрузить модуль основных рекомендаций C++ .
    • Так как Visual Studio 2019 больше не рекомендует задавать esp.annotationbuildlevel переменную среды, так как параметр может привести к ложным срабатываниям. Если вы видите непредвиденные результаты, удалите эту переменную из среды.
    • set caexcludepath=%include% Настоятельно рекомендуется отключить предупреждения, которые запускают стандартные заголовки. Здесь можно добавить дополнительные пути, например путь к общим заголовкам в проекте.
  • Параметры командной строки

    • /analyze Включает анализ кода (рекомендуется также использовать /analyze:only и /analyze:quiet).
    • /analyze:plugin EspXEngine.dll Этот параметр загружает модуль расширений анализа кода в PREfast. Этот механизм, в свою очередь, загружает средство проверки основных рекомендаций C++ .

Использование библиотеки поддержки руководства

Библиотека поддержки руководства (GSL) предназначена для выполнения основных рекомендаций. GSL включает определения, которые позволяют заменить конструкции, подверженные ошибкам, более безопасными альтернативами. Например, можно заменить T*, length пару параметров типом span<T> . Проект GSL доступен на сайте GitHub на сайте https://github.com/Microsoft/GSL. Библиотека является открытым исходным кодом, поэтому вы можете просматривать источники, делать примечания или вносить вклад. Вы также можете использовать диспетчер пакетов vcpkg для скачивания и установки библиотеки локально.

Использование рекомендаций по проверке ядра C++ в проектах Visual Studio 2015

Если вы используете Visual Studio 2015, наборы правил анализа кода C++ Core Check не устанавливаются по умолчанию. Другие шаги необходимы, прежде чем включить средства анализа кода C++ Core в Visual Studio 2015. Корпорация Майкрософт предоставляет поддержку проектов Visual Studio 2015 с помощью пакета NuGet. Пакет называется Microsoft.CppCoreCheck, и он доступен по http://www.nuget.org/packages/Microsoft.CppCoreCheckадресу. Для этого пакета требуется по крайней мере Visual Studio 2015 с установленным обновлением 1.

Пакет также устанавливает другой пакет в качестве зависимости, библиотеку поддержки только заголовков (GSL). GSL также доступен на сайте GitHub https://github.com/Microsoft/GSL.

Из-за того, как правила анализа кода загружаются в Visual Studio 2015, необходимо установить Microsoft.CppCoreCheck пакет NuGet в каждый проект C++, который требуется проверить.

Добавление пакета Microsoft.CppCoreCheck в проект в Visual Studio 2015

  1. В Обозреватель решений щелкните правой кнопкой мыши контекстное меню проекта в решении, в которое нужно добавить пакет. Выберите "Управление пакетами NuGet", чтобы открыть диспетчер пакетов NuGet.

  2. В окне диспетчер пакетов NuGet найдите Microsoft.CppCoreCheck.

    Окно Nuget диспетчер пакетов с пакетом CppCoreCheck.

  3. Выберите пакет Microsoft.CppCoreCheck, а затем нажмите кнопку "Установить ", чтобы добавить правила в проект.

    Пакет NuGet добавляет MSBuild-файл .targets в проект, который вызывается при включении анализа кода в проекте. Файл .targets добавляет правила проверки ядра C++ в качестве другого расширения в средство анализа Visual Studio Code. При установке пакета можно использовать диалоговое окно "Страницы свойств", чтобы включить или отключить выпущенные и экспериментальные правила.

См. также