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

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

Расширение шашки

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

  1. Перечислите функцию в 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>
    Этот синтаксис указывает, что Bug Finder должен проверить второй аргумент Rte_Write_int функция для определения, указывает ли аргумент на инициализированный буфер. Удалите ранее существующие записи в файле, чтобы избежать предупреждений.

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

    <function name="Rte_Write_*">
       <check name="ARGUMENT_POINTS_TO_INITIALIZED_VALUE" arg="2"/>
    </function>

  2. Укажите этот XML- файл в качестве аргумента для опции -code-behavior-specifications.

Если вы перезапустите анализ, вы увидите дефект Non-initialized variable на &x когда функция Rte_Write_int вызывается.

Шашки, которые могут быть расширены

The Non-initialized variable с помощью этой опции флажок расширен.

См. также

Похожие темы