Эта тема показывает, как расширить средства проверки для инициализации, чтобы проверять аргументы функции, переданные указателями. По умолчанию Средство поиска Ошибки не проверяет эти аргументы на инициализацию при вызове функции, потому что вы можете выполнить инициализацию в теле функции. Однако для определенных функций, можно расширить средства проверки, чтобы проверять аргументы, переданные указателями для инициализации при вызове функции.
Предположим, что вы рассматриваете некоторые вызовы функции как часть системного контура, и вы хотите убедиться, что вы передаете инициализированные буферы через контур. Например, Среда выполнения или Rte_
функции в AUTOSAR позволяют компоненту программного обеспечения связываться с другими компонентами программного обеспечения. Вы можете хотеть гарантировать, что аргументы указателя к этим функциям указывают на инициализированные буферы.
Например, рассмотрите этот фрагмент кода:
extern void Rte_Write_int(unsigned int, int*); void writeValueToAddress() { const unsigned int module_id = 0xfe; int x; Rte_Write_int(module_id, &x); }
x
передается указателем на Rte_Write_int
функция. Средство поиска ошибки не проверяет x
для инициализации при вызове функции. В теле Rte_Write_int
, при попытке считать x
, Средство поиска ошибки отмечает неинициализированную переменную. Однако вы не можете смочь обеспечить модуль, содержащий тело функции для анализа, и можете хотеть обнаружить тот x
не инициализируется при самом вызове функции.Можно указать, что аргументы указателя к некоторым функциям должны указать на инициализированные буферы. Например, чтобы задать тот Rte_Write_int
одна такая функция:
Перечислите функцию в XML-файле в определенном синтаксисе.
Скопируйте файл шаблона code-behavior-specifications-template.xml
от папки
к перезаписываемому местоположению и изменяют файл. Введите функцию в файл с помощью следующего синтаксиса после существующих подобных записей:polyspaceroot
\polyspace\verifier\cxx
<function name="Rte_Write_int"> <check name="ARGUMENT_POINTS_TO_INITIALIZED_VALUE" arg="2"/> </function>
Rte_Write_int
функция, чтобы определить, указывает ли аргумент на инициализированный буфер. Удалите ранее существующие записи в файле, чтобы избежать предупреждений.Можно также использовать подстановочный знак *
покрывать группу функций. Задавать все функции, начинающиеся с Rte_Write_
, Введите:
<function name="Rte_Write_*"> <check name="ARGUMENT_POINTS_TO_INITIALIZED_VALUE" arg="2"/> </function>
Задайте этот XML-файл в качестве аргумента для опции -code-behavior-specifications
.
Если вы повторно выполняете анализ, вы видите дефект Non-initialized variable на &x
когда функциональный Rte_Write_int
называется.
Non-initialized variable
(Polyspace Bug Finder Access) средство проверки расширен с помощью этой опции.