Причины кода непроверенного

Проблема

После верификации вы видите в графиках Code covered by verification, что значительный фрагмент вашего кода не проверялся на ошибки времени выполнения.

Например, в следующем графике, панель Dashboard показывает, что целых 75% ваших функций не проверялись на ошибки времени выполнения. (В функциях, которые проверялись, не проверялись только 7% операций.)

Процент кода непроверенный в покрытиях графика Code covered by verification:

  • Функции и операции, которые не проверяются, потому что они, как доказывают, недостижимы.

    Они кажутся серыми на панели Source.

  • Функции и операции, которые не доказаны недостижимыми, но не проверенные по некоторой другой причине.

    Они кажутся черными на панели Source.

Кликните по графику Code covered by verification, чтобы видеть список функций непроверенных.

Возможная причина: ошибки компиляции

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

Чтобы видеть, не скомпилировали ли некоторые файлы, проверяйте панель Dashboard или Output Summary. Чтобы убедиться, что все файлы компилируют перед анализом, используйте опцию Stop analysis if a file does not compile (-stop-if-compile-error).

Решение

Зафиксируйте ошибки компиляции и повторно выполните анализ.

Для получения дополнительной информации о:

Возможная причина: рано Красная или серая проверка

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

  • Красная проверка: верификация не проверяет последующие операции в блок кода, содержащий красную проверку.

  • Серая проверка: Серые проверки указывают на недостижимый код. Верификация не проверяет операции в недостижимый код для ошибок времени выполнения.

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

Например, в следующем коде, только 1 из 4 функций проверяется, и график Procedure показывает 25%. Функции func_called_from_unreachable_1, func_called_from_unreachable_2 и func_called_after_red не проверяются. Только main проверяется.

void func_called_from_unreachable_1(void) {
}

void func_called_from_unreachable_2(void) {     
}

void func_called_after_red(void) {
}

int glob_var;

void main(void) {
     int loc_var;
     double res;
     
     glob_var=0;
     glob_var++;
     
     if (glob_var!=1) {
           func_called_from_unreachable_1();
           func_called_from_unreachable_2();
     }
     
     res=0;
     /* Division by zero occurs in for loop */
     for(loc_var=-10;loc_var<10;loc_var++) {
	          res += 1/loc_var;
     }
     
     func_called_after_red();
}

Решение

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

Чтобы переместиться от main вниз по иерархии вызова функции и идентифицировать, где код непроверенный начинается, используйте функции навигации на панели Call Hierarchy. Если вы не видите панель по умолчанию, выберите Window> Show/Hide View> Call Hierarchy. Для получения дополнительной информации смотрите Иерархию Вызова.

Также можно рассмотреть произвольную функцию непроверенную и заняться расследованиями, почему она не проверяется. Смотрите, запрашивает ли то же обоснование много функций. Чтобы обнаружить, если функция не вызвана вообще от точки входа или названа из недостижимого кода, используйте опцию Detect uncalled functions (-uncalled-function-checks).

Рассмотрите красные или серые проверки и зафиксируйте их.

Возможная причина: неправильные опции

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

  • Многозадачные опции: Если вы проверяете многозадачный код через эти опции, вы задаете свои функции точки входа.

    Возможные ошибки в спецификации включают:

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

    • С ручной многозадачной настройкой вы не задавали все свои точки входа.

  • Основные опции генерации: Через эти опции вы генерируете функцию main, если она не существует в вашем коде. При проверке модулей или библиотек, вы используете эти опции.

    Вы не задавали все функции, которые должен вызвать сгенерированный main.

  • Входные параметры и блокирующие опции: Через эти опции вы ограничиваете переменные диапазоны снаружи своего кода или силы, блокирующей из функций.

    Возможные ошибки в спецификации включают:

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

    • Вы заблокировали некоторые функции непреднамеренно.

  • Макросы: Через эти опции вы задаете или не задаете макросы препроцессора.

    Вам придется явным образом задать макрос, который ваш компилятор рассматривает неявно, как задано.

Решение

Проверяйте свои опции в предыдущий порядок. Если ваши спецификации являются неправильными, фиксируют их.

Возможная причина: незавершение main

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

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

Например, в этом примере, task2 не проверяется, даже если вы задаете его как точку входа. Причиной является бесконечный цикл в функции main.

void performTask1Cycle(void);
void performTask2Cycle(void);

void main() {
 while(1) {
    performTask1Cycle();
  } 
}

void task2() {
 while(1) {
    performTask2Cycle();
  }
}

Вы видите ключевое слово while в функции main, подчеркнутой в пунктирном красном. Подсказка указывает, что цикл не может остановиться.

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

Решение: отключите функцию main

Зафиксируйте причину, почему функция main не останавливается.

  • Если причиной является определенная ошибка времени выполнения (красная проверка), зафиксируйте ошибку.

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

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