Пошаговое руководство. Анализ кода C/C++ для дефектов
В этом пошаговом руководстве показано, как анализировать код C/C++ для потенциальных дефектов кода. В нем используются средства анализа кода для кода C/C++.
В этом пошаговом руководстве вы узнаете:
- Запустите анализ кода в машинном коде.
- Анализ предупреждений о дефектах кода.
- Обработайте предупреждение как ошибку.
- Заметите исходный код для улучшения анализа дефектов кода.
Необходимые компоненты
- Копия примера CppDemo.
- Базовое понимание C/C++.
Выполнение анализа кода в машинном коде
Выполнение анализа дефектов кода в машинном коде
Откройте решение CppDemo в Visual Studio.
Решение CppDemo теперь заполняет Обозреватель решений.
В меню "Сборка " выберите " Перестроить решение".
Решение выполняет сборку без ошибок или предупреждений.
В Обозреватель решений выберите проект CodeDefects.
В меню Проект выберите Свойства.
Откроется диалоговое окно "Страницы свойств CodeDefects".
Выберите страницу свойств Анализа кода.
Измените свойство Enable Code Analysis on Build на Yes. Нажмите ОК, чтобы сохранить внесенные изменения.
Перестройте проект CodeDefects.
Предупреждения анализа кода отображаются в окне списка ошибок.
Откройте решение CppDemo в Visual Studio.
Решение CppDemo теперь заполняет Обозреватель решений.
В меню "Сборка " выберите " Перестроить решение".
Решение выполняет сборку без ошибок или предупреждений.
Примечание.
В Visual Studio 2017 в обработчике IntelliSense может отображаться предупреждение.
E1097 unknown attribute "no_init_all"
Это предупреждение можно проигнорировать.В Обозреватель решений выберите проект CodeDefects.
В меню Проект выберите Свойства.
Откроется диалоговое окно "Страницы свойств CodeDefects".
Выберите страницу свойств Анализа кода.
Установите флажок "Включить анализ кода для сборки". Нажмите ОК, чтобы сохранить внесенные изменения.
Перестройте проект CodeDefects.
Предупреждения анализа кода отображаются в окне списка ошибок.
Анализ предупреждений об ошибках кода
В меню "Вид" выберите "Список ошибок".
Этот пункт меню может не отображаться. Это зависит от профиля разработчика, выбранного в Visual Studio. Возможно, вам придется указать другие окна в меню "Вид ", а затем выбрать список ошибок.
В окне списка ошибок дважды щелкните следующее предупреждение:
C6230: неявное приведение между семантически разными типами: использование HRESULT в логическое контексте.
В редакторе кода отображается строка, которая вызвала предупреждение внутри функции
bool ProcessDomain()
. Это предупреждение указывает, что используетсяHRESULT
в операторе if, где ожидается логический результат. Обычно это ошибка, так как приS_OK
возврате HRESULT из функции, указываемой на успешность, но при преобразовании в логическое значение, которое он оценивает.false
Исправьте это предупреждение с помощью
SUCCEEDED
макроса, который преобразуется вtrue
то время, когдаHRESULT
возвращаемое значение указывает на успешность. Код должен выглядеть следующим образом:if (SUCCEEDED(ReadUserAccount()))
В списке ошибок дважды щелкните следующее предупреждение:
C6282: неправильный оператор: назначение константы в логическом контексте. Вместо этого рекомендуется использовать '=='.
Исправьте это предупреждение, проверив равенство. Код должен выглядеть следующим образом:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
Исправьте остальные предупреждения C6001 в списке ошибок путем инициализации
i
иj
до 0.Перестройте проект CodeDefects.
Проект выполняет сборку без предупреждений или ошибок.
Исправлены предупреждения о заметках исходного кода
Включение предупреждений о заметках исходного кода в annotation.c
В Обозреватель решений выберите проект "Заметки".
В меню Проект выберите Свойства.
Откроется диалоговое окно "Страницы свойств заметок ".
Выберите страницу свойств Анализа кода.
Измените свойство Enable Code Analysis on Build на Yes. Нажмите ОК, чтобы сохранить внесенные изменения.
В Обозреватель решений выберите проект "Заметки".
В меню Проект выберите Свойства.
Откроется диалоговое окно "Страницы свойств заметок ".
Выберите страницу свойств Анализа кода.
Установите флажок "Включить анализ кода для сборки". Нажмите ОК, чтобы сохранить внесенные изменения.
Исправление предупреждений о заметках исходного кода в аннотации.c
Перестройте проект примечаний.
В меню "Сборка " выберите "Выполнить анализ кода" в заметках.
В списке ошибок дважды щелкните следующее предупреждение:
C6011: разыменовывание указателя NULL newNode.
Это предупреждение указывает на сбой вызывающего объекта для проверки возвращаемого значения. В этом случае вызов
AllocateNode
может возвращать значение NULL. См. файл заголовка annotations.h для объявленияAllocateNode
функции.Курсор находится в расположении в файле annotations.cpp, где произошло предупреждение.
Чтобы исправить это предупреждение, используйте оператор if для проверки возвращаемого значения. Код должен выглядеть следующим образом:
LinkedList* newNode = AllocateNode(); if (nullptr != newNode) { newNode->data = value; newNode->next = 0; node->next = newNode; }
Перестройте проект примечаний.
Проект выполняет сборку без предупреждений или ошибок.
Использование заметки исходного кода для обнаружения дополнительных проблем
Использование заметки исходного кода
Заметите формальные параметры и возвращаемое значение функции
AddTail
, чтобы указать, что значения указателя могут иметь значение NULL:_Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
В меню Сборка выберите Выполнить анализ кода в решении.
В списке ошибок дважды щелкните следующее предупреждение:
C6011: разыменовывание указателя NULL "node".
Это предупреждение указывает, что узел, переданный в функцию, может иметь значение NULL.
Чтобы исправить это предупреждение, используйте оператор if в начале функции для проверки переданного значения. Код должен выглядеть следующим образом:
if (nullptr == node) { return nullptr; }
В меню Сборка выберите Выполнить анализ кода в решении.
Теперь проект выполняет сборку без предупреждений или ошибок.
См. также
Пошаговое руководство. Проверка управляемого кода на наличие дефектов
Анализ кода для C/C++