Просмотр и исправление проверок условий правильности

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

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

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

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

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

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

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

  • При размене указатель на функцию имеет значение NULL.

    В следующем примере красная проверка происходит, потому что, когда dereferenced, указатель на функцию имеет значение 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, которое происходит ранее в коде. Если предположение не имеет значения true в вашем случае, добавьте комментарий или обоснование в свой результат или код. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.