Define Custom Annotation Format
This example shows how to create and edit an XML file to define an annotation format and map it to the Polyspace® annotation syntax. Once you create and edit the XML file, pass the file to Polyspace by using option -xml-annotations-description.
To define multiple custom annotation formats, see Define Multiple Custom Annotation Syntaxes.
To get started, copy the following code to a text editor and save it on your machine as annotations_description.xml.
<?xml version="1.0" encoding="UTF-8"?>
<Annotations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="annotations_xml_schema.xsd"
Group="example XML">
<Expressions Search_For_Keywords="myKeyword"
Separator_Result_Name="," >
<!-- Define annotation format in this
section by adding <Expression/> elements -->
<Expression Mode="SAME_LINE"
Regex="myKeyword\s+(\w+(\s*,\s*\w+)*)"
Rule_Identifier_Position="1"
/>
<Expression Mode="GOTO_INCREMENT"
Regex="myKeyword\s+(\+\d+\s)(\w+(\s*,\s*\w+)*)"
Increment_Position="1"
Rule_Identifier_Position="2"
/>
<Expression Mode="BEGIN"
Regex="myKeyword\s*(\w+(\s*,\s*\w+)*)\s*Block_on"
Rule_Identifier_Position="1"
Case_Insensitive="true"
/>
<Expression Mode="END"
Regex="myKeyword\s*(\w+(\s*,\s*\w+)*)\s*Block_off"
Rule_Identifier_Position="1"
/>
<Expression Mode="END_ALL"
Regex="myKeyword\sBlock_off_all"
/>
<Expression Mode="SAME_LINE"
Regex="myKeywords\s+(\w+(\s*,\s*\w+)*)(\s*\[(\w+\s*)*([:]\s*(\w+\s*)+)*\])*(\s*-*\s*)*([^-]*)(\s*-*)*"
Rule_Identifier_Position="1"
Status_Position="4"
Severity_Position="6"
Comment_Position="8"
/>
<!-- SAME_LINE example with more complex regular expression.
Matches the following annotations:
//myKeywords 50 [my_status:my_severity] -Additional comment-
//myKeywords 50 [my_status]
//myKeywords 50 [:my_severity]
//myKeywords 50 -Additional comment-
-->
</Expressions>
<Mapping>
<!-- Map your annotation syntax to the Polyspace annotation
syntax by adding <Result_Name_Mapping /> elements in this section -->
<Result_Name_Mapping Rule_Identifier="100" Family="DEFECT" Result_Name="INT_ZERO_DIV"/>
<Result_Name_Mapping Rule_Identifier="50" Family="MISRA-C3" Result_Name="8.4"/>
<Result_Name_Mapping Rule_Identifier="51" Family="MISRA-C3" Result_Name="8.7"/>
<Result_Name_Mapping Rule_Identifier="ALL_MISRA" Family="MISRA-C3" Result_Name="*"/>
</Mapping>
</Annotations>The XML file consists of two parts:
<Expressions>...</Expressions>where you define the format of your annotation syntax.<Mapping>...</Mapping>where you map your syntax to the Polyspace annotation syntax.
After you edit this file, Polyspace can interpret your custom code annotation when you invoke the option -xml-annotations-description.
Define Annotation Syntax Format
To define an annotation syntax in Polyspace, your syntax must follow a pattern that you can represent with a regular expression. See Regular Expressions. It is recommended that you include a keyword in the pattern of your annotation syntax to help identify it. In this example, the keyword is myKeyword. Set the attribute Search_For_Keywords equal to this keyword. Polyspace looks for the keyword as a standalone word in your annotations. Matches that are part of a longer word are ignored.
Once you know the pattern of your annotation, you can define it in the XML by adding an <Expression/> element and specifying at least the attributes Mode, Regex, and Rule_Identifier_Position. For instance, the first <Expression/> element in annotations_description.xml defines an annotation with these attributes:
Mode="SAME_LINE". The annotation applies to code on the same line.Regex="myKeyword\s+(\w+(\s*,\s*\w+)*)". Polyspace uses the regular expression to search for a string that begins withmyKeyword, followed by a space\s+. Polyspace then searches for a capturing group(\w+(\s*,\s*\w+)*)that includes an alphanumeric rule identifier\w+and, optionally, additional comma-separated rule identifiers(\s*,\s*\w+)*.Rule_Identifier_Position="1". The integer value of this attribute corresponds to the number of opening parentheses preceding the relevant capturing group in the regular expression. InmyKeyword\s+(\w+(\s*,\s*\w+)*), one opening parenthesis precedes the capturing group of the rule identifier(\w+(\s*,\s*\w+)*). If you want to match rule identifiers captured by(\s*,\s*\w+), then you setRule_Identifier_Position="2"because two opening parentheses precede this capturing group.
The list of attributes and their values are listed in this table. The example column refers to the format defined in annotations_description.xml.
| Attribute | Use | Value | Example |
|---|---|---|---|
Mode | Required | SAME_LINE | Applies only on the same line as the annotation. |
GOTO_INCREMENT | Applies on the same line as the annotation and the following n lines: The preceding annotation applies to lines 3–6 only. | ||
BEGIN | Applies to the same line and all following lines until a corresponding expression with attribute | ||
END | Stops the application of a rule identifier declared by a corresponding expression with attribute Only rule identifier 50 is turned off. Rule identifier 51 still applies. | ||
END_ALL | Stops all rule identifiers declared by an expression with attribute Rule identifiers 50 and 51 are turned off. | ||
Regex | Required | Regular expression search string | See Regular Expressions. |
Rule_Identifier_Position | Required, except when you set Mode="END_ALL" | Integer | The integer value of this attribute corresponds to the number of opening parentheses in the regular expression before the relevant search expression. The search expression for the rule identifier |
Increment_Position | Required only when you set Mode="GOTO_INCREMENT" | Integer | The integer value of this attribute corresponds to the number of opening parentheses in the regular expression before the relevant search expression. The search expression for the increment |
Status_Position | Optional | Integer | See Increment_Position example. When you use this attribute, the entry in your annotation is displayed in the Status column on the Results List pane of the user interface. |
Severity_Position | Optional | Integer | See Increment_Position example. When you use this attribute, the entry in your annotation is displayed in the Severity column on the Results List pane of the user interface. |
Comment_Position | Optional | Integer | See Increment_Position example. When you use this attribute, the entry in your annotation is displayed in the Comment column on the Results List pane of the user interface. Your comment is appended to the string Justified by annotation in source: |
Case_Insensitive | Optional | True or false | When you set this attribute to "true", the regular expression is case insensitive, otherwise it is case sensitive. If you do not declare this attribute in your expression, the regular expression is case sensitive. For |
Map Your Annotation to the Polyspace Annotation Syntax
After you define your annotation format, you can map the rule identifiers you are using to their corresponding Polyspace annotation syntax. You can do this mapping by adding an <Result_Name_Mapping/> element and specifying attributes Rule_Identifier, Family, and Result_Name. For instance, if rule identifier 50 corresponds to MISRA C™: 2012 rule 8.4, map it to the Polyspace syntax MISRA-C3:8.4 by using this element:
<Result_Name_Mapping Rule_Identifier="50" Family="MISRA-C3" Result_Name="8.4"/>The list of attributes and their values are listed in this table. The example column refers to the format defined in annotations_description.xml.
| Attribute | Use | Value | Example |
|---|---|---|---|
Rule_Identifier | Required | User defined. Each value must be unique. | See the mapping section of annotations_description.xml |
Family | Required | Corresponds to Polyspace results family. For a list of allowed values, see allowed values. | See the mapping section of annotations_description.xml |
Result_Name | Required | Corresponds to Polyspace result names. For a list of allowed values, see allowed values. | See the mapping section of annotations_description.xml |
Define Multiple Custom Annotation Syntaxes
To define more than one annotation syntax, in your XML file, specify a comma separated list of keywords associated with each syntax for the Search_For_Keywords attribute.
For example, if you use custom annotations that follow these patterns to annotate violations of MISRA C: 2012 rules:
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 with otherCustomSyntax.