В этом разделе показано, как расширить шашки для инициализации, чтобы проверить аргументы функции, переданные указателями. По умолчанию Bug Finder не проверяет эти аргументы на инициализацию в точке вызова функции, потому что вы можете выполнить инициализацию в теле функции. Однако для конкретных функций можно расширить шашки, чтобы проверить аргументы, переданные указателями для инициализации в точке вызова функции.
Предположим, что вы рассматриваете некоторые вызовы функций как часть контура системы и хотите убедиться, что вы передаете инициализированные буферы через контур. Например, окружение Run-Time или 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
функция. Bug Finder не проверяет x
для инициализации в точке вызова функции. В теле Rte_Write_int
, если вы пытаетесь прочитать x
Bug Finder помечает неинициализированную переменную. Однако вы, возможно, не сможете предоставить модуль, содержащий тело функции, для анализа и, возможно, захотите обнаружить это 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
вызывается.
The Non-initialized variable
с помощью этой опции флажок расширен.