В этом примере показано, как создать и отредактировать XML-файл, чтобы задать формат аннотации и сопоставить его с синтаксисом аннотации Polyspace®. Если вы создаете и редактируете XML-файл, передаете файл Polyspace при помощи опции -xml-annotations-description
.
Чтобы задать несколько пользовательских форматов аннотации, смотрите, Задают Несколько Пользовательских Синтаксисов Аннотации.
Чтобы начать, скопируйте следующий код в текстовый редактор и сохраните его на своей машине как annotations_description.xml
.
|
XML-файл состоит из двух частей:
<Expressions>...</Expressions>
где вы задаете формат своего синтаксиса аннотации.
<Mapping>...</Mapping>
где вы сопоставляете свой синтаксис с синтаксисом аннотации Polyspace.
После того, как вы редактируете этот файл, Polyspace может интерпретировать вашу аннотацию пользовательского кода, когда вы вызываете опцию -xml-annotations-description
.
Чтобы задать синтаксис аннотации в Polyspace, ваш синтаксис должен следовать за шаблоном, который можно представлять регулярным выражением. Смотрите Регулярные выражения. Рекомендуется, чтобы вы включали ключевое слово в шаблон вашего синтаксиса аннотации, чтобы помочь идентифицировать его. В этом примере ключевым словом является myKeyword
. Установите атрибут Search_For_Keywords
равняйтесь этому ключевому слову.
Если вы знаете шаблон своей аннотации, можно задать его в XML путем добавления <Expression/>
элемент и задающий, по крайней мере, атрибуты Mode
, Regex
, и Rule_Identifier_Position
. Например, первый <Expression/>
элемент в annotations_description.xml
задает аннотацию с этими атрибутами:
Mode="SAME_LINE"
. Аннотация применяется к коду по той же линии.
Regex="myKeyword\s+(\w+(\s*,\s*\w+)*)"
. Polyspace использует регулярное выражение, чтобы искать строку, которая начинается с myKeyword
, сопровождаемый пробелом \s+
. Polyspace затем ищет группу фиксации (\w+(\s*,\s*\w+)*)
это включает алфавитно-цифровой идентификатор правила \w+
и, опционально, дополнительные разделенные от запятой идентификаторы правила (\s*,\s*\w+)*
.
Rule_Identifier_Position="1"
. Целочисленное значение этого атрибута соответствует количеству вводных круглых скобок, предшествующих соответствующей группе фиксации в регулярном выражении. В myKeyword\s+(\w+(\s*,\s*\w+)*)
, одна вводная круглая скобка предшествует группе фиксации идентификатора правила (\w+(\s*,\s*\w+)*)
. Если вы хотите совпадать с идентификаторами правила, полученными (\s*,\s*\w+)
, затем вы устанавливаете Rule_Identifier_Position="2"
потому что две вводных круглых скобки предшествуют этой группе фиксации.
Список атрибутов и их значений перечислен в этой таблице. Столбец в качестве примера относится к формату, заданному в annotations_description.xml
.
Атрибут | Использование | Значение | Пример |
---|---|---|---|
Mode | Необходимый | SAME_LINE | Применяется только на ту же линию как аннотация. code; //myKeyword 100 |
GOTO_INCREMENT
| Применяется на ту же линию как аннотация и следующие n линии: 3. code; // myKeyword +3 ALL_MISRA
4. /*comments */
5.
6. code;
7. code;
Предыдущая аннотация применяется к линиям 3–6 только. | ||
BEGIN
| Применяется к той же линии и всему после линий до соответствующего выражения с атрибутом //myKeyword 50, 51 Block_on
Code block 1;
... | ||
END
| Останавливает приложение идентификатора правила, объявленного соответствующим выражением с атрибутом //myKeyword 50, 51 Block_on Code block 1; ... More code; //myKeyword 50 Block_off Только постановите, что идентификатор 50 выключен. Постановите, что идентификатор 51 все еще применяется. | ||
END_ALL
| Остановки все идентификаторы правила, объявленные выражением с атрибутом //myKeyword 50, 51 Block_on Code block 1; ... More code; //myKeyword Block_off_all Постановите, что идентификаторы 50 и 51 выключены. | ||
Regex | Необходимый | Строка поиска регулярного выражения | Смотрите регулярные выражения. // myKeyword 50, 51
/* myKeyword ALL_MISRA, 100 */ |
Rule_Identifier_Position | Необходимый, кроме тех случаев, когда вы устанавливаете Mode="END_ALL" | Целое число | Целочисленное значение этого атрибута соответствует количеству вводных круглых скобок в регулярном выражении перед соответствующим поисковым выражением. <Expression Mode="GOTO_INCREMENT" Regex="myKeyword\s+(\+\d+\s)(\w+(\s*,\s*\w+)*)" Increment_Position="1" Rule_Identifier_Position="2"/> Поисковое выражение для идентификатора правила |
Increment_Position | Требуемый только, когда вы устанавливаете Mode="GOTO_INCREMENT" | Целое число | Целочисленное значение этого атрибута соответствует количеству вводных круглых скобок в регулярном выражении перед соответствующим поисковым выражением. <Expression Mode="GOTO_INCREMENT" Regex="myKeyword\s+(\+\d+\s)(\w+(\s*,\s*\w+)*)" Increment_Position="1" Rule_Identifier_Position="2"/> Поисковое выражение для инкрементного |
Status_Position | Дополнительный | Целое число | Смотрите Increment_Position пример. Когда вы используете этот атрибут, запись в вашей аннотации отображена в столбце Status на панели Results List пользовательского интерфейса. |
Severity_Position | Дополнительный | Целое число | Смотрите Increment_Position пример. Когда вы используете этот атрибут, запись в вашей аннотации отображена в столбце Severity на панели Results List пользовательского интерфейса. |
Comment_Position
| Дополнительный | Целое число | Смотрите Increment_Position пример. Когда вы используете этот атрибут, запись в вашей аннотации отображена в столбце Comment на панели Results List пользовательского интерфейса. Ваш комментарий добавлен к строке Justified by annotation in source: |
Case_Insensitive
| Дополнительный | TRUE или FALSE | Когда вы устанавливаете этот атрибут на "истинный", регулярное выражение является нечувствительным к регистру, в противном случае это является чувствительным к регистру. Если вы не объявляете этот атрибут в своем выражении, регулярное выражение является чувствительным к регистру. Для //MYKEYWORD ALL_MISRA BLOCK_ON
//mykeyword all_misra block_on
|
После того, как вы задаете свой формат аннотации, можно сопоставить идентификаторы правила, которые вы используете для их соответствующего синтаксиса аннотации Polyspace. Можно сделать это отображение путем добавления <Result_Name_Mapping/>
элемент и задающие атрибуты Rule_Identifier
, Family
, и Result_Name
. Например, если идентификатор правила 50 соответствует MISRA C®: 2 012 правил 8.4, карта это к синтаксису Polyspace MISRA-C3:8.4
при помощи этого элемента:
<Result_Name_Mapping Rule_Identifier="50" Family="MISRA-C3" Result_Name="8.4"/>
Список атрибутов и их значений перечислен в этой таблице. Столбец в качестве примера относится к формату, заданному в annotations_description.xml
.
Атрибут | Использование | Значение | Пример |
---|---|---|---|
Rule_Identifier | Необходимый | Определяемый пользователем. Каждое значение должно быть уникальным. | Смотрите раздел отображения annotations_description.xml |
Family | Необходимый | Соответствует семейству результатов Polyspace. Для списка позволенных значений смотрите позволенные значения. | Смотрите раздел отображения annotations_description.xml |
Result_Name | Необходимый | Соответствует именам результата Polyspace. Для списка позволенных значений смотрите позволенные значения. | Смотрите раздел отображения annotations_description.xml |
Чтобы задать больше чем один синтаксис аннотации, в вашем XML-файле, задают список разделенных запятой значений ключевых слов, сопоставленных с каждым синтаксисом для Search_For_Keywords
атрибут.
Например, если вы используете пользовательские аннотации, которые следуют за этими шаблонами, чтобы аннотировать нарушения MISRA C: 2 012 правил:
int func(int p) //customSyntax M123 $ customSyntax M124
{
int i;
int j = 1;
i = 1024 / (j - p);
return i;
}
int func2(void){ //otherCustomSyntax 50
int x=func(2);
return x;
}
<?xml version="1.0" encoding="UTF-8"?>
<Annotations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="annotations_xml_schema.xsd"
Group="multipleCustomSyntax">
<!-- Enter comma separated list of keywords -->
<Expressions Search_For_Keywords="customSyntax,otherCustomSyntax"
Separator_Result_Name="$" >
<!-- This section defines the annotation syntax format -->
<Expression Mode="SAME_LINE"
Regex="customSyntax\s(\w+(\s*,\s*\w+)*)"
Rule_Identifier_Position="1"
/>
<Expression Mode="SAME_LINE"
Regex="otherCustomSyntax\s(\w+(\s*,\s*\w+)*)"
Rule_Identifier_Position="1"
/>
</Expressions>
<!-- This section maps the user annotation to the Polyspace
annotation syntax -->
<Mapping>
<!-- Mapping for customSyntax rules -->
<Result_Name_Mapping Rule_Identifier="M123" Family="MISRA-C3" Result_Name="8.7"/>
<Result_Name_Mapping Rule_Identifier="M124" Family="MISRA-C3" Result_Name="D4.6"/>
<!-- Mapping for otherCustomSyntax rules -->
<Result_Name_Mapping Rule_Identifier="50" Family="MISRA-C3" Result_Name="8.4"/>
</Mapping>
</Annotations>
M123
с otherCustomSyntax
.