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

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

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

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

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

На панели Results List выберите проверку. На панели Result Details отображаются дополнительные сведения о проверке.

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

  • Непосредственная причина проверки. Для образца:

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

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

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

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

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

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

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

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

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

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

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

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

    Выполните те же шаги исследования первопричины, что и для проверки Division by Zero. Смотрите Обзор и исправление деления по нулевым проверкам.

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

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

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

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

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

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

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

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

Шаг 3: Проверка трассировки на допущение Polyspace

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

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

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

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

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

Для получения дополнительной информации смотрите Допущения анализа Code Prover.

Примечание

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