exponenta event banner

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

Выполните одно или несколько из этих действий, пока не определите исправление для проверки недопустимых операций C++. Существует несколько способов исправить красный или оранжевый чек. Описание проверки и примеры кода см. в разделе Invalid C++ specific operations.

Иногда, особенно для оранжевой проверки, можно определить, что проверка представляет собой не реальную ошибку, а предположение Polyspace ®, которое не соответствует вашему коду. Если для смягчения предположения можно использовать опцию анализа, повторно запустите проверку с помощью этой опции. В противном случае в результат или код можно добавить комментарий и обоснование.

Общий рабочий процесс, применяемый ко всем проверкам, см. в разделе Интерпретация результатов проверки кода в пользовательском интерфейсе Polyspace Desktop.

Шаг 1: Интерпретировать информацию о проверке

На панели Список результатов (Results List) выберите флажок. На панели Сведения о результатах (Result Details) отображается дополнительная информация о чеке.

Вы можете видеть:

  • Непосредственная причина проверки. Например:

    • Размер массива не является строго положительным.

      Например, массив создается с помощью оператора arr = new char [num]. num может быть нулевым или отрицательным.

      Возможное исправление: Использовать num как размер массива, только если он положительный.

    • typeid оператор отменяет, возможно, NULL указатель.

      Возможное исправление: Перед использованием typeid оператор на указателе, проверьте указатель для NULL.

    • dynamic_cast оператор выполняет недопустимое приведение.

      Возможное исправление: Недопустимый приведение приводит к NULL возвращаемое значение для указателей и std::bad_cast исключение для ссылок. Постарайтесь избежать недопустимого приведения. В противном случае, если неверное приведение находится на указателях, проверьте возвращаемое значение dynamic_cast для NULL перед исключением. Если недопустимая приведение находится в ссылках, убедитесь, что вы ловите std::bad_cast исключение в try-catch заявление.

  • Вероятная первопричина проверки, если она указана.

Шаг 2: Определение первопричины проверки

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

Основываясь на характере ошибки, используйте один из следующих методов для поиска первопричины.

ОшибкаКак найти первопричину
Размер массива не является положительным.
  1. Трассировка потока данных для переменной размера.

    Выполните те же шаги по расследованию первопричин, что и для проверки деления по нулю. См. раздел Проверка и исправление деления по нулевым проверкам.

  2. Укажите точку, в которой можно ограничить переменную размера массива положительными значениями.

typeid оператор отменяет, возможно, NULL указатель.
  1. Трассировка потока данных для переменной указателя.

    Выполните те же шаги по расследованию первопричин, что и при проверке указателя «Незаконно». См. раздел Просмотр и исправление незаконных проверок указателей.

  2. Укажите точку, для которой можно проверить указатель NULL.

dynamic_cast оператор выполняет недопустимое приведение.

Перейдите к определениям соответствующих классов. Определите отношение наследования между классами.

  1. На панели «Источник» в интерфейсе пользователя Polyspace щелкните правой кнопкой мыши имя класса.

  2. Выберите «Перейти к определению».

Шаг 3: Проверка трассировки в соответствии с предположением Polyspace

Проверьте, можно ли отследить оранжевый чек по предположению Polyspace, которое встречается ранее в коде. Если предположение не соответствует действительности в вашем случае, добавьте комментарий или обоснование в результат или код. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.

Например, переменная размера массива получается из упорной функции getSize. Затем:

  1. Polyspace предполагает, что возвращаемое значение getSize является полным диапазоном. Диапазон включает непозволительные значения.

  2. Использование переменной в качестве размера массива при динамическом выделении памяти приводит к появлению оранжевых операций с недопустимым C++.

  3. Если известно, что переменная принимает положительное значение, добавьте комментарий и обоснование, объясняющие, почему вы не изменили код.

Дополнительные сведения см. в разделе Допущения анализа проверки кода.

Примечание

Прежде чем обосновывать проверку оранжевого цвета, тщательно продумайте, можно ли улучшить дизайн кода.