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


Пошаговое руководство. Проверка кода C/C++ на наличие дефектов

Обновлен: Ноябрь 2007

Данное пошаговое руководство содержит инструкции по проверке кода C/C++ на наличие возможных дефектов при помощи средства анализа кода C/C++.

В настоящем пошаговом руководстве приведено подробное описание процесса анализа кода для выявления возможных дефектов в коде C/C++.

Руководство включает описание следующих шагов:

  • Проведение анализа машинного кода

  • Анализ предупреждений о дефектах кода

  • Обработка предупреждения как ошибки

  • Создание заметок к исходному коду для повышения эффективности проверки кода на наличие дефектов

Обязательные компоненты

  • Visual Studio Team System Development Edition.

  • Копия примера Пример Demo.

  • Общее представление о языках C/C++.

Проведение проверки машинного кода на наличие дефектов

  1. Откройте решение Demo в Development Edition.

    Решение Demo теперь появилось в обозревателе решений.

  2. Выберите пункт Перестроить решение в меню Построение.

    Построение решения проходит без ошибок и предупреждений.

  3. Выберите проект CodeDefects в обозревателе решений.

  4. Выберите пункт Свойства в меню Проект.

    Появится диалоговое окно Страницы свойств CodeDefects.

  5. Выберите пункт Анализ кода.

  6. Выберите значение Да (/анализировать) в раскрывающемся списке Включить анализ кода для C/C++ и нажмите кнопку OK.

  7. Постройте проект CodeDefects заново.

    Предупреждения анализа кода отображаются в окне Список ошибок.

Анализ предупреждений о дефектах инициализации кода

  1. Выберите пункт Список ошибок в меню Вид.

    В зависимости от выбранного в Visual Studio 2005 Team System профиля разработчика может потребоваться навести указатель на пункт Другие окна в меню Вид и выбрать пункт Список ошибок.

  2. Щелкните дважды следующее предупреждение в списке ошибок:

    предупреждение C6230. Неявное приведение между семантически разными типами: использование HRESULT в логическом контексте.

    В редакторе кода отображается строка, вызвавшая предупреждение в функции boolProcessDomain(). Данное предупреждение означает, что в операторе "if" используется HRESULT, тогда как ожидается логический результат.

  3. Устраните причину данного предупреждения при помощи макроса SUCCEEDED. Теперь код должен выглядеть следующим образом:

    if (SUCCEEDED (ReadUserAccount()) )
    
  4. Щелкните дважды следующее предупреждение в списке ошибок:

    предупреждение C6282. Неверный оператор: присваивание постоянной в контексте теста. Использование "==" является намеренным?

  5. Устраните причину данного предупреждения при помощи проверки на равенство. Теперь код должен выглядеть следующим образом:

    if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
    

Обработка предупреждения как ошибки

  1. Добавьте следующий оператор #pragma в начало файла Bug.cpp, чтобы предупреждение C6001 обрабатывалось как ошибка:

    #pragma warning (error: 6001)
    
  2. Постройте проект CodeDefects заново.

    В окне Список ошибок предупреждение C6001 теперь отображается в виде ошибки.

  3. Устраните причины двух оставшихся в списке ошибок ошибок C6001 путем инициализации i и j в значение 0.

  4. Постройте проект CodeDefects заново.

    Построение проекта теперь будет проходить без предупреждений и ошибок.

Исправление предупреждений заметок к исходному коду в файле annotation.c

  1. Выберите проект Annotations в обозревателе решений.

  2. Выберите пункт Свойства в меню Проект.

    Появится диалоговое окно Страницы свойств заметок.

  3. Выберите пункт Анализ кода.

  4. Выберите значение Да (/анализировать) в раскрывающемся списке Включить анализ кода для C/C++ и нажмите кнопку OK.

  5. Постройте проект Annotations заново.

  6. Щелкните дважды следующее предупреждение в списке ошибок:

    предупреждение C6011. Отмена ссылки с указателем NULL под названием "newNode".

    Данное предупреждение говорит о неудачной попытке проверки вызывающим объектом возвращаемого значения. В данном случае вызов AllocateNode может вернуть значение NULL (объявление функции для AllocateNode см. в файле заголовка annotations.h).

  7. Откройте файл Annotation.c.

  8. Чтобы устранить причину данного предупреждения, используйте оператор "if" для проверки возвращаемого значения. Теперь код должен выглядеть следующим образом:

    if (NULL != newNode)

    {

    newNode->data = value;

    newNode->next = 0;

    node->next = newNode;

    }

  9. Постройте проект Annotations заново.

    Построение проекта теперь будет проходить без предупреждений и ошибок.

Использование заметок к исходному коду

  1. Создайте заметки к формальным параметрам и возвращаемому значению функции AddTail при помощи пред- и постусловий, как показано в следующем примере:

    [returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail

    (

        [SA_Pre(Null=SA_Maybe)] LinkedList* node,

        int value

     )

  2. Постройте проект Annotations заново.

  3. Щелкните дважды следующее предупреждение в списке ошибок:

    предупреждение C6011. Отмена ссылки с указателем NULL под названием "node".

    Данное предупреждение говорит о том, что переданный в функцию узел, возможно, имеет нулевое значение.

  4. Чтобы устранить причину данного предупреждения, используйте оператор "if" для проверки возвращаемого значения. Теперь код должен выглядеть следующим образом:

      . . .
      LinkedList *newNode = NULL; 
      if (NULL == node)
      {
           return NULL;
          . . .
      }
    
  5. Постройте проект Annotations заново.

    Построение проекта теперь будет проходить без предупреждений и ошибок.

См. также

Задачи

Пошаговое руководство. Проверка управляемого кода на наличие дефектов