Пошаговое руководство. Проверка кода C/C++ на наличие дефектов
Данное пошаговое руководство содержит инструкции по проверке кода C/C++ на наличие возможных дефектов при помощи средства анализа кода C/C++.
В настоящем пошаговом руководстве приведено подробное описание процесса анализа кода для выявления возможных дефектов в коде C/C++.
Руководство включает описание следующих шагов:
Проведение анализа машинного кода
Анализ предупреждений о дефектах кода
Обработка предупреждения как ошибки
Создание заметок к исходному коду для повышения эффективности проверки кода на наличие дефектов
Обязательные компоненты
Visual Studio Premium или Visual Studio Ultimate.
Копия примера Пример Demo.
Общее представление о языках C/C++.
Проверка машинного кода на дефекты
Откройте решение Demo в Visual Studio.
Решение Demo теперь появилось в обозревателе решений.
Выберите пункт Перестроить решение в меню Построение.
Построение решения проходит без ошибок и предупреждений.
Выберите проект CodeDefects в обозревателе решений.
В меню Проект выберите пункт Свойства.
Появится диалоговое окно Страницы свойств CodeDefects.
Выберите пункт Анализ кода.
Установите флажок Включить анализ кода C/C++ при построении.
Постройте проект CodeDefects заново.
Предупреждения анализа кода отображаются в окне Список ошибок.
Анализ предупреждений о дефектах кода
В меню Вид выберите пункт Список ошибок.
В зависимости от выбранного в Visual Studio профиля разработчика может потребоваться выбрать пункт Другие окна в меню Вид и щелкнуть Список ошибок.
Щелкните дважды следующее предупреждение в списке ошибок:
предупреждение C6230. Неявное приведение между семантически разными типами: использование HRESULT в логическом контексте.
В редакторе кода отображается строка, вызвавшая предупреждение в функции boolProcessDomain().Данное предупреждение означает, что в операторе "if" используется HRESULT, тогда как ожидается логический результат.
Устраните причину данного предупреждения при помощи макроса SUCCEEDED.Код должен иметь следующий вид:
if (SUCCEEDED (ReadUserAccount()) )
Щелкните дважды следующее предупреждение в списке ошибок:
предупреждение C6282. Неверный оператор: присваивание постоянной в контексте теста.Использование "==" является намеренным?
Устраните причину данного предупреждения при помощи проверки на равенство.Теперь код должен выглядеть следующим образом:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
Обработка предупреждения как ошибки
Добавьте следующий оператор #pragma в начало файла Bug.cpp, чтобы предупреждение C6001 обрабатывалось как ошибка:
#pragma warning (error: 6001)
Постройте проект CodeDefects заново.
В окне Список ошибок предупреждение C6001 теперь отображается в виде ошибки.
Устраните причины двух оставшихся в списке ошибок ошибок C6001 путем инициализации i и j в значение 0.
Постройте проект CodeDefects заново.
Построение проекта теперь будет проходить без предупреждений и ошибок.
Исправление предупреждений заметок к исходному коду в файле annotation.c
Выберите проект Annotations в обозревателе решений.
В меню Проект выберите пункт Свойства.
Появится диалоговое окно Страницы свойств заметок.
Выберите пункт Анализ кода.
Установите флажок Включить анализ кода C/C++ при построении.
Постройте проект Annotations заново.
Щелкните дважды следующее предупреждение в списке ошибок:
предупреждение C6011. Отмена ссылки с указателем NULL под названием "newNode".
Данное предупреждение говорит о неудачной попытке проверки вызывающим объектом возвращаемого значения.В данном случае вызов AllocateNode может вернуть значение NULL (объявление функции для AllocateNode см. в файле заголовка annotations.h).
Откройте файл annotations.cpp.
Чтобы устранить причину данного предупреждения, используйте оператор "if" для проверки возвращаемого значения.Код должен иметь следующий вид:
if (NULL != newNode)
{
newNode->data = value;
newNode->next = 0;
node->next = newNode;
}
Постройте проект Annotations заново.
Построение проекта теперь будет проходить без предупреждений и ошибок.
Использование заметок к исходному коду
Создайте заметки к формальным параметрам и возвращаемому значению функции AddTail при помощи пред- и постусловий, как показано в следующем примере:
[returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail
(
[SA_Pre(Null=SA_Maybe)] LinkedList* node,
int value
)
Постройте проект Annotations заново.
Щелкните дважды следующее предупреждение в списке ошибок:
предупреждение C6011. Отмена ссылки с указателем NULL под названием "node".
Предупреждение показывает, что узел, переданный функции, может иметь значение NULL, и выводит номер строки, на которой возникло предупреждение.
Чтобы устранить причину данного предупреждения, используйте оператор "if" для проверки возвращаемого значения.Код должен иметь следующий вид:
. . . LinkedList *newNode = NULL; if (NULL == node) { return NULL; . . . }
Постройте проект Annotations заново.
Построение проекта теперь будет проходить без предупреждений и ошибок.
См. также
Задачи
Пошаговое руководство. Проверка управляемого кода на наличие дефектов