exponenta event banner

Проверка и исправление проверки состояния корректности

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

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

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

Шаг 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.

  • Значение переменной выходит за пределы диапазона, заданного в режиме глобального подтверждения. См. раздел Ограничение диапазона глобальных переменных.

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

    • Для переменной задается диапазон 0... 10glob.

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

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

На основе информации проверки на панели Сведения о результате (Result Details) выполните дальнейшие действия для определения первопричины. В интерфейсе пользователя Polyspace можно выполнить только следующие действия.

Проверить информациюОпределение первопричины

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

  1. Для определения размеров массива см. определение каждой переменной массива.

    Щелкните правой кнопкой мыши переменную и выберите «Перейти к определению».

  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. Щелкните правой кнопкой мыши тип указателя функции и выберите Перейти к определению.

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

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

Значение переменной выходит за пределы диапазона, заданного в режиме глобального подтверждения.

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

  1. Щелкните правой кнопкой мыши переменную. Выберите Показать в представлении переменного доступа (Show In Variable Access View).

  2. На панели «Доступ к переменной» выберите каждый экземпляр переменной.

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

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