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

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

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

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

Шаг 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. Если вы знаете, что переменная принимает положительное значение, добавьте комментарий и выравнивание, объясняющее, почему вы не изменили свой код.

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

Примечание

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