Пошаговое руководство. Проверка кода C/C++ на наличие дефектов
Обновлен: Ноябрь 2007
Данное пошаговое руководство содержит инструкции по проверке кода C/C++ на наличие возможных дефектов при помощи средства анализа кода C/C++.
В настоящем пошаговом руководстве приведено подробное описание процесса анализа кода для выявления возможных дефектов в коде C/C++.
Руководство включает описание следующих шагов:
Проведение анализа машинного кода
Анализ предупреждений о дефектах кода
Обработка предупреждения как ошибки
Создание заметок к исходному коду для повышения эффективности проверки кода на наличие дефектов
Обязательные компоненты
Visual Studio Team System Development Edition.
Копия примера Пример Demo.
Общее представление о языках C/C++.
Проведение проверки машинного кода на наличие дефектов
Откройте решение Demo в Development Edition.
Решение Demo теперь появилось в обозревателе решений.
Выберите пункт Перестроить решение в меню Построение.
Построение решения проходит без ошибок и предупреждений.
Выберите проект CodeDefects в обозревателе решений.
Выберите пункт Свойства в меню Проект.
Появится диалоговое окно Страницы свойств CodeDefects.
Выберите пункт Анализ кода.
Выберите значение Да (/анализировать) в раскрывающемся списке Включить анализ кода для C/C++ и нажмите кнопку OK.
Постройте проект CodeDefects заново.
Предупреждения анализа кода отображаются в окне Список ошибок.
Анализ предупреждений о дефектах инициализации кода
Выберите пункт Список ошибок в меню Вид.
В зависимости от выбранного в Visual Studio 2005 Team System профиля разработчика может потребоваться навести указатель на пункт Другие окна в меню Вид и выбрать пункт Список ошибок.
Щелкните дважды следующее предупреждение в списке ошибок:
предупреждение 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++ и нажмите кнопку OK.
Постройте проект Annotations заново.
Щелкните дважды следующее предупреждение в списке ошибок:
предупреждение C6011. Отмена ссылки с указателем NULL под названием "newNode".
Данное предупреждение говорит о неудачной попытке проверки вызывающим объектом возвращаемого значения. В данном случае вызов AllocateNode может вернуть значение NULL (объявление функции для AllocateNode см. в файле заголовка annotations.h).
Откройте файл Annotation.c.
Чтобы устранить причину данного предупреждения, используйте оператор "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".
Данное предупреждение говорит о том, что переданный в функцию узел, возможно, имеет нулевое значение.
Чтобы устранить причину данного предупреждения, используйте оператор "if" для проверки возвращаемого значения. Теперь код должен выглядеть следующим образом:
. . . LinkedList *newNode = NULL; if (NULL == node) { return NULL; . . . }
Постройте проект Annotations заново.
Построение проекта теперь будет проходить без предупреждений и ошибок.
См. также
Задачи
Пошаговое руководство. Проверка управляемого кода на наличие дефектов