Выполните один или несколько из следующих шагов до тех пор, пока вы не определите исправление для проверки Invalid C++ specific operations. Существует несколько способов исправить красный или оранжевый чек. Для получения описания примеров проверки и кода смотрите Invalid C++ specific operations
.
Иногда, особенно для оранжевого чека, можно определить, что чек представляет не реальную ошибку, а Polyspace® предположение, что не соответствует действительности для вашего кода. Если для ослабления допущения можно использовать опцию анализа, повторите верификацию с помощью этой опции. В противном случае можно добавить комментарий и обоснование в результат или код.
Общий рабочий процесс, который применяется ко всем проверкам, см. в разделе Интерпретация результатов Prover кода в пользовательском интерфейсе рабочего стола Polyspace.
На панели 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
оператор.
Вероятная первопричина проверки, если она указана.
Если вы не можете определить первопричину на основе информации о проверке, используйте ярлыки навигации в пользовательском интерфейсе, чтобы перейти к первопричине.
Основываясь на характере ошибки, используйте один из следующих методов для поиска первопричины.
Ошибка | Как найти первопричину |
---|---|
Размер массива непозитивен. |
|
The typeid оператор разыменует возможно NULL указатель. |
|
The dynamic_cast оператор выполняет недопустимое приведение. | Перейдите к определениям вовлеченных классов. Определите отношения наследования между классами.
|
Посмотрите, можно ли проследить оранжевую проверку до допущения Polyspace, которое происходит ранее в коде. Если предположение не имеет значения true в вашем случае, добавьте комментарий или обоснование в свой результат или код. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Например, вы получаете переменную размера массива из упрямой функции getSize
. Затем:
Polyspace принимает, что возврат значение getSize
- полный диапазон. Эта область значений включает непозитивные значения.
Использование переменной в качестве размера массива при динамическом выделении памяти приводит к оранжевому Invalid C++ specific operations.
Если вы знаете, что переменная принимает положительное значение, добавьте комментарий и обоснование, объясняющее, почему вы не изменили код.
Для получения дополнительной информации смотрите Допущения анализа Code Prover.
Примечание
Прежде чем обосновывать оранжевую проверку, внимательно рассмотрим, сможете ли вы улучшить свои проекты кодирования.