Уменьшите использование памяти и время, затраченное анализом Polyspace

Проблема

Верификация застряла в определенной точке надолго. Иногда, после того, как период бездействия превышает внутренний порог, верификация останавливается или вы получаете сообщение об ошибке:

The analysis has been stopped by timeout.

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

Fatal error: Not enough memory

Если у вас есть многоядерная система с более чем четырьмя процессорами, попробуйте увеличить количество процессоров, используя опцию -max-processes. По умолчанию в верификации используется до четырех процессоров. Если у вас меньше четырех процессоров, то при верификации используется максимальное доступное число. Для анализа необходимо иметь не менее 4 ГБ оперативной памяти на процессор. Например, если ваша машина имеет 16 ГБ оперативной памяти, не используйте эту опцию, чтобы задать более четырех процессоров.

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

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

Polyspace® создает некоторые временные файлы во время анализа. Если папка, используемая для хранения этих файлов, находится на сетевом диске, анализ может замедлиться.

Решение: Изменение временной папки

Измените временную папку на путь к локальному диску.

Чтобы узнать, как Polyspace определяет временное расположение папки, смотрите Хранение временных файлов.

Возможная причина: Антивирусное программное обеспечение

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

Сконфигурируйте исключения для процессов Polyspace

Проверьте выполняемые процессы и убедитесь, что антивирус потребляет большой объем памяти.

См. раздел «Ошибка или медленные запуски дефрагментации диска и антивирусного ПО».

Возможная причина: Большое и сложное применение

Время верификации зависит от размера и сложности вашего кода.

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

Number of lines without comments

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

Решение: Используйте Polyspace Bug Finder First

Используйте Polyspace Bug Finder™ сначала, чтобы найти дефекты в вашем коде. Некоторые дефекты, которые обнаруживает Polyspace Bug Finder, могут привести к красной ошибке в Polyspace Code Prover™. После устранения этих дефектов используйте Polyspace Code Prover для более строгой верификации.

Решение: Модуляризация применения

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

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

    1. Запустите быструю начальную верификацию с самой низкой точностью и уровнем верификации. См. Precision level (-O) и Verification level (-to).

    2. Выберите Tools > Run Modularize.

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

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

    Модуляризировать приложение можно из командной строки. Используйте polyspace-modularize команда в polyspaceroot\ polyspace\bin. Для получения дополнительной информации о команде используйте -h опция.

  • При запуске верификации в пользовательском интерфейсе можно создать несколько модулей в проекте и скопировать исходные файлы в эти модули. Чтобы начать, щелкните правой кнопкой мыши проект и выберите Create new module.

  • Можно выполнить верификацию файла по файлам. Каждый файл сам по себе образует модуль. См. Verify files independently (-unit-by-unit).

Когда вы делите полное приложение на модули, у каждого модуля отсутствует некоторая информация. Например, один модуль может содержать вызов функции, заданный в другом модуле. Программа делает определенные допущения относительно неопределенных функций. Если предположения шире, чем фактическое представление функции, вы видите увеличение оранжевых проверок от сверхприближения. Например, функция управления ошибками может вернуть int значение 0 или 1. Однако, когда Polyspace не может найти определение функции, он принимает, что функция возвращает все возможные значения, разрешенные для int переменная. Можно сузить допущения путем определения внешних ограничений.

При модуляризации приложения вручную можно придерживаться собственного подхода модуляризации. Например, можно скопировать в один модуль только критические файлы, которые вас беспокоят, и проверить их. Вы можете представлять оставшиеся файлы через внешние ограничения, при условии, что вы уверены, что ограничения представляют отсутствующий код достоверно. Например, ограничения на неопределенную функцию представляют функцию достоверно, если они представляют значение возвращаемой функции, а также воспроизводят другие релевантные побочные эффекты функции. Чтобы задать внешние ограничения, используйте опцию Constraint setup (-data-range-specifications).

Решение: Выберите более низкий уровень точности или уровень верификации

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

  • Уровень точности определяет алгоритм, используемый для верификации. Более высокая точность приводит к большему количеству проверенных результатов, но также требует большего времени верификации. Для получения дополнительной информации смотрите Precision level (-O).

  • Уровень верификации определяет количество раз, когда Polyspace запускается на вашем исходном коде. Для получения дополнительной информации смотрите Verification level (-to).

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

Решение: Уменьшите сложность кода

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

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

Решение: Вычисление только совместного использования и использования глобальных переменных

Запустите менее обширный анализ Code Prover на вашем приложении, который вычисляет только совместное использование и использование глобальных переменных. Затем можно запустить полный компонент анализа по компонентам для обнаружения ошибок времени выполнения. См. Show global variable sharing and usage only (-shared-variables-mode).

Решение: Включите приближения

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

СитуацияОпция
Ваш код содержит структуры, которые имеют много уровней глубины.Depth of verification inside structures (-k-limiting)
Журнал верификации содержит рекомендации по встроению определенных функций.Inline (-inline)

Решение: Удалить части кода

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

Несмотря на сокращение времени анализа, можно увидеть увеличение оранжевых проверок из-за допущений Polyspace об упрямых функциях. См. Допущения об упрямых функциях.

Возможная причина: Слишком много точек входа для многозадачных приложений

Если ваш код предназначен для многозадачности и вы предоставляете много Задач, верификация может занять много времени. Может появиться следующее предупреждение:

Warning: Important use of shared variables have been detected, 
|        verification carry on but to avoid scaling issues 
|        it roughly approximates shared variables values. 
|        You may consider adding -force-refined-shared-variables-analysis 
                                              option to improve results
Если вы получите это предупреждение, это означает, что Polyspace переходит в менее точный режим анализа, чтобы завершить верификацию за разумное время. В этом менее точном режиме верификация может рассматривать некоторые общие переменные как полный диапазон и вызывать оранжевые проверки от сверхприближения.

Решение

Вместо использования опции -force-refined-shared-variables-analysis чтобы сохранить точный анализ, можно уменьшить количество заданных точек входа. Если вы знаете, что некоторые из функций точки входа не выполняются одновременно, вы не должны указывать их как отдельные точки входа. Можно вызвать эти функции последовательно в функции wrapper, а затем задать функцию wrapper в качестве точки входа.

Например, если известно, что точка входа функционирует task1, task2, и task3 не выполнять одновременно:

  1. Задайте функцию обертки task который вызывает task1, task2, и task3 во всех возможных последовательностях.

    void task() {
       volatile int random = 0;
       if (random) {
           task1();
           task2();
           task3();
      } else if (random) {
           task1();
           task3();
           task2();
      } else if (random) {
           task2();
           task1();
           task3();
      } else if (random) {
           task2();
           task3();
           task1();
      } else if (random) {
           task3();
           task1();
           task2();
      } else {
           task3();
           task2();
           task1();
      } 
    }
    

  2. Вместо task1, task2, и task3, задайте task для опции Tasks (-entry-points).

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

Внешние веб-сайты