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

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

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

Для общего рабочего процесса, который применяется ко всем проверкам, смотрите, Интерпретируют Результаты Polyspace Code Prover.

Шаг 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. Проследите поток данных для переменной размера.

    Выполните те же шаги расследования первопричины что касается проверки Division by Zero. Смотрите Анализ и Зафиксируйте Проверки Деления на нуль.

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

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

    Выполните те же шаги расследования первопричины что касается проверки Illegally dereferenced pointer. Смотрите Анализ и Зафиксируйте Незаконно Разыменованные Проверки Указателя.

  2. Идентифицируйте точку, где можно протестировать указатель на NULL.

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

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

  1. На панели Source в пользовательском интерфейсе Polyspace щелкните правой кнопкой по имени класса.

  2. Выберите Go To Definition.

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

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

Например, вы получаете переменную размера массивов из заблокированного функционального getSize. Затем:

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

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

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

Для получения дополнительной информации смотрите Аналитические Предположения Программы автоматического доказательства Кода.

Примечание

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