Рассмотрите и зафиксируйте проверки условия правильности

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

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

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

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

На панели Results List выберите проверку. Просмотрите причину, проверяют панель Result Details. Следующий список показывает некоторые возможные причины:

  • Массив преобразован в другой массив большего размера.

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

  • Когда разыменовано, указатель функции имеет значение NULL.

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

  • Когда разыменовано, указатель функции не указывает на функцию.

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

  • Указатель функции указывает на функцию, но типы аргумента указателя и функции не соответствуют. Например:

    typedef int (*typeFuncPtr) (complex*);
    int func(int* x);
    .
    .
    typeFuncPtr funcPtr = &func;

    В следующем примере красная проверка происходит потому что:

    • Указатель функции указывает на функциональный func.

    • func ожидает аргумент типа int, но соответствующий аргумент указателя функции является структурой.

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

    typedef int (*typeFuncPtr) (int, int);
    int func(int);
    .
    .
    typeFuncPtr funcPtr = &func;.

    В следующем примере красная проверка происходит потому что:

    • Указатель функции указывает на функциональный func.

    • func ожидает один аргумент, но указатель функции имеет два аргумента.

  • Указатель функции указывает на функцию, но типы возврата указателя и функции не соответствуют. Например:

    typedef double (*typeFuncPtr) (int);
    int func(int);
    .
    .
    typeFuncPtr funcPtr = &func;
    

    В следующем примере красная проверка происходит потому что:

    • Указатель функции указывает на функциональный func.

    • func возвращает значение int, но типом возврата указателя функции является double.

  • Значение переменной выходит за пределы области значений, которую вы задаете через режим Global Assert. Смотрите Ограничивают Область значений Глобальной переменной.

    В следующем примере красная проверка происходит потому что:

    • Вы задаете область значений 0... 10 для переменной glob.

    • Значение переменной выходит за пределы этой области значений.

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

На основе информации о проверке о панели Result Details выполните дальнейшие шаги, чтобы определить первопричину. Можно выполнить следующие шаги в пользовательском интерфейсе Polyspace только.

Проверяйте информациюКак определить первопричину

Массив преобразован в другой массив большего размера.

  1. Чтобы определить размеры массивов, см. определение каждой переменной типа массив.

    Щелкните правой кнопкой по переменной и выберите Go To Definition.

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

    1. Щелкните правой кнопкой по переменной. Выберите Search For All References.

      Все экземпляры переменной появляются на панели Search с текущим подсвеченным экземпляром.

    2. На панели Search выберите предыдущие экземпляры.

Проблемы при разыменовании указателя функции:

  • Указатель функции имеет значение NULL, когда разыменовано.

  • Указатель функции не указывает на функцию, когда разыменовано.

  • Указатель функции указывает на функцию, но типы аргумента указателя и функции не соответствуют.

  • Указатель функции указывает на функцию, но количества аргумента указателя и функции не соответствуют.

  • Указатель функции указывает на функцию, но типы возврата указателя и функции не соответствуют.

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

    1. Щелкните правой кнопкой по указателю функции. Выберите Search For All References.

      Все экземпляры указателя функции появляются на панели Search с текущим подсвеченным экземпляром.

    2. На панели Search выберите предыдущие экземпляры.

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

    typeFuncPtr funcPtr = func;

    1. Щелкните правой кнопкой по типу указателя функции и выберите Go To Definition.

    2. Щелкните правой кнопкой по функции и выберите Go To Definition. Если определение не существует, эта опция показывает функциональное тупиковое определение вместо этого. В этом случае найдите объявление функции.

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

Значение переменной выходит за пределы области значений, которую вы задаете через режим Global Assert.

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

  1. Щелкните правой кнопкой по переменной. Выберите Show In Variable Access View.

  2. На панели Variable Access выберите каждый экземпляр переменной.

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

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