cppcheck/cfg/cppcheck-cfg.rng
rikardfalkeborn 491ee577c6 Support floats in valid config (#1297)
* Add tests for invalid ranges

* Refactor loadLibErrors

This reduces the amount of code slightly and will simplify adding
more tests.

* Handle empty valid field

Before this change, the sequence <valid></valid> in a config file would
result in a segmentation fault. Now an empty field results in the error
message:

cppcheck: Failed to load library configuration file 'mycfg.cfg'. Bad attribute value '""'

* Add support for valid for floating point arguments

Previously, it was not possible to add valid ranges to floating point
arguments since it only handled integers. This made ranges not work well
for floating point arguments since arguments were cast to integers
before the ranges were handled.

Fix this by using doubles instead of integers if the argument is a float.
Add some tests for this and make sure errors are printed with enough
precision (somewhat arbitrarily chosen).

Note that it is still only possible to add integer ranges (i.e. -1:1).

* Add support for floats in configuration valid range

Now that it is possible to handle decimal arguments, there is no reason
to not allow non-integer ranges. Take care to not allow broken
configurations.

* Move check to within if-clause

* Move asin{,f,l} and acos{,f,l} input checks to config file
2018-07-15 22:47:56 +02:00

444 lines
14 KiB
XML

<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="def">
<optional>
<attribute name="format">
<value>2</value>
</attribute>
</optional>
<zeroOrMore>
<choice>
<element name="define">
<attribute name="name"><text/></attribute>
<attribute name="value"><text/></attribute>
</element>
<element name="memory">
<zeroOrMore>
<choice>
<element name="dealloc">
<optional>
<attribute name="arg">
<ref name="ARGNO"/>
</attribute>
</optional>
<ref name="DATA-EXTNAME"/>
</element>
<element name="alloc">
<optional>
<attribute name="init"><ref name="DATA-BOOL"/></attribute>
</optional>
<optional>
<attribute name="arg"><ref name="ARGNO"/></attribute>
</optional>
<ref name="DATA-NAME"/>
</element>
<element name="use"><ref name="DATA-EXTNAME"/></element>
</choice>
</zeroOrMore>
</element>
<element name="resource">
<zeroOrMore>
<choice>
<element name="dealloc">
<optional>
<attribute name="arg">
<ref name="ARGNO"/>
</attribute>
</optional>
<ref name="DATA-EXTNAME"/>
</element>
<element name="alloc">
<optional>
<attribute name="init"><ref name="DATA-BOOL"/></attribute>
</optional>
<optional>
<attribute name="arg"><ref name="ARGNO"/></attribute>
</optional>
<ref name="DATA-NAME"/>
</element>
<element name="use"><ref name="DATA-EXTNAME"/></element>
</choice>
</zeroOrMore>
</element>
<element name="function">
<attribute name="name">
<ref name="DATA-EXTNAME"/>
</attribute>
<zeroOrMore>
<choice>
<element name="noreturn"><ref name="DATA-BOOL"/></element>
<element name="pure"><empty/></element>
<element name="const"><empty/></element>
<element name="ignorefunction"><ref name="DATA-BOOL"/></element>
<element name="leak-ignore"><empty/></element>
<element name="returnValue">
<optional>
<attribute name="type">
<data type="string">
<param name="pattern">([a-zA-Z_][a-zA-Z_0-9]*[ ])*([a-zA-Z_][a-zA-Z_0-9]*::)*[a-zA-Z_][a-zA-Z_0-9]*([ ]?[*&amp;])*</param>
</data>
</attribute>
</optional>
<optional>
<attribute name="container">
<data type="positiveInteger"/>
</attribute>
</optional>
<text/>
</element>
<element name="use-retval"><empty/></element>
<element name="formatstr">
<optional>
<attribute name="scan"><ref name="DATA-BOOL"/></attribute>
</optional>
<optional>
<attribute name="secure"><ref name="DATA-BOOL"/></attribute>
</optional>
<empty/>
</element>
<element name="warn">
<attribute name="severity">
<choice>
<value>error</value>
<value>warning</value>
<value>style</value>
<value>performance</value>
<value>portability</value>
<value>information</value>
</choice>
</attribute>
<optional>
<attribute name="reason">
<choice>
<value>Obsolescent</value>
<value>Obsolete</value>
</choice>
</attribute>
</optional>
<optional>
<attribute name="alternatives">
<ref name="DATA-EXTNAME"/>
</attribute>
</optional>
<optional>
<attribute name="cstd">
<value>c99</value>
</attribute>
</optional>
<text/>
</element>
<element name="arg">
<attribute name="nr">
<choice>
<ref name="ARGNO"/>
<value>any</value>
<value>variadic</value>
</choice>
</attribute>
<optional>
<attribute name="default">
<text/>
</attribute>
</optional>
<zeroOrMore>
<choice>
<element name="formatstr"><empty/></element>
<element name="strz"><empty/></element>
<element name="not-bool"><empty/></element>
<element name="not-null"><empty/></element>
<element name="not-uninit"><empty/></element>
<element name="valid">
<data type="string">
<param name="pattern">(-?[0-9]*(\.[0-9]+)?[,:])*([-]?[0-9]+(\.[0-9]+)?)?</param>
</data>
</element>
<element name="minsize">
<attribute name="type">
<choice>
<value>strlen</value>
<value>argvalue</value>
<value>sizeof</value>
<value>mul</value>
</choice>
</attribute>
<attribute name="arg">
<ref name="ARGNO"/>
</attribute>
<optional>
<attribute name="arg2">
<ref name="ARGNO"/>
</attribute>
</optional>
</element>
<element name="iterator">
<attribute name="container">
<data type="positiveInteger"/>
</attribute>
<attribute name="type">
<choice>
<value>first</value>
<value>middle</value>
<value>last</value>
</choice>
</attribute>
</element>
</choice>
</zeroOrMore>
</element>
</choice>
</zeroOrMore>
</element>
<element name="markup">
<attribute name="ext">
<data type="string">
<param name="pattern">[.][a-z]+</param>
</data>
</attribute>
<attribute name="aftercode"><ref name="DATA-BOOL"/></attribute>
<attribute name="reporterrors"><ref name="DATA-BOOL"/></attribute>
<optional>
<element name="keywords">
<zeroOrMore>
<element name="keyword">
<attribute name="name"><ref name="DATA-NAME"/></attribute>
</element>
</zeroOrMore>
</element>
</optional>
<zeroOrMore>
<element name="codeblocks">
<zeroOrMore>
<element name="block">
<attribute name="name"><ref name="DATA-NAME"/></attribute>
</element>
</zeroOrMore>
<optional>
<element name="structure">
<attribute name="offset"><data type="integer"/></attribute>
<attribute name="start"><text/></attribute>
<attribute name="end"><text/></attribute>
</element>
</optional>
</element>
</zeroOrMore>
<optional>
<element name="exported">
<zeroOrMore>
<element name="exporter">
<attribute name="prefix"><ref name="DATA-NAME"/></attribute>
<zeroOrMore>
<choice>
<element name="prefix"><ref name="DATA-NAME"/></element>
<element name="suffix"><ref name="DATA-NAME"/></element>
</choice>
</zeroOrMore>
</element>
</zeroOrMore>
</element>
</optional>
<optional>
<element name="imported">
<zeroOrMore>
<element name="importer"><ref name="DATA-NAME"/></element>
</zeroOrMore>
</element>
</optional>
</element>
<element name="reflection">
<zeroOrMore>
<element name="call">
<attribute name="arg"><ref name="ARGNO"/></attribute>
<ref name="DATA-NAME"/>
</element>
</zeroOrMore>
</element>
<element name="container">
<attribute name="id"><text/></attribute>
<optional>
<attribute name="endPattern"><text/></attribute>
</optional>
<optional>
<attribute name="startPattern"><text/></attribute>
</optional>
<optional>
<attribute name="inherits"><text/></attribute>
</optional>
<optional>
<attribute name="opLessAllowed"><ref name="DATA-BOOL"/></attribute>
</optional>
<optional>
<attribute name="itEndPattern"><text/></attribute>
</optional>
<zeroOrMore>
<choice>
<element name="type">
<choice>
<attribute name="templateParameter"><data type="integer"/></attribute>
<attribute name="string">
<value>std-like</value>
</attribute>
</choice>
<empty/>
</element>
<element name="size">
<optional>
<attribute name="templateParameter"><data type="integer"/></attribute>
</optional>
<zeroOrMore>
<element name="function">
<attribute name="name"><ref name="DATA-NAME"/></attribute>
<choice>
<attribute name="action">
<ref name="CONTAINER-ACTION"/>
</attribute>
<attribute name="yields">
<ref name="CONTAINER-YIELDS"/>
</attribute>
</choice>
<empty/>
</element>
</zeroOrMore>
</element>
<element name="access">
<optional>
<attribute name="indexOperator">
<value>array-like</value>
</attribute>
</optional>
<zeroOrMore>
<element name="function">
<attribute name="name">
<ref name="DATA-EXTNAME"/>
</attribute>
<optional>
<attribute name="action">
<ref name="CONTAINER-ACTION"/>
</attribute>
</optional>
<optional>
<attribute name="yields">
<ref name="CONTAINER-YIELDS"/>
</attribute>
</optional>
<empty/>
</element>
</zeroOrMore>
</element>
</choice>
</zeroOrMore>
</element>
<element name="podtype">
<attribute name="name"><ref name="DATA-EXTNAME"/></attribute>
<optional>
<attribute name="size">
<choice>
<value>1</value>
<value>2</value>
<value>4</value>
<value>8</value>
</choice>
</attribute>
</optional>
<optional>
<attribute name="sign">
<choice>
<value>s</value>
<value>u</value>
</choice>
</attribute>
</optional>
<empty/>
</element>
<element name="platformtype">
<attribute name="name"><ref name="DATA-EXTNAME"/></attribute>
<attribute name="value"><ref name="DATA-NAME"/></attribute>
<oneOrMore>
<choice>
<element name="unsigned"><empty/></element>
<element name="long"><empty/></element>
<element name="pointer"><empty/></element>
<element name="const_ptr"><empty/></element>
<element name="ptr_ptr"><empty/></element>
<element name="platform">
<attribute name="type"><ref name="DATA-NAME"/></attribute>
<empty/>
</element>
</choice>
</oneOrMore>
</element>
</choice>
</zeroOrMore>
</element>
</start>
<define name="ARGNO">
<data type="integer">
<param name="minInclusive">1</param>
<param name="maxInclusive">20</param>
</data>
</define>
<define name="DATA-BOOL">
<choice>
<value>true</value>
<value>false</value>
</choice>
</define>
<define name="DATA-NAME">
<data type="string">
<param name="pattern">[a-zA-Z_][a-zA-Z_0-9]*</param>
</data>
</define>
<define name="DATA-EXTNAME">
<data type="string">
<param name="pattern">[a-zA-Z_][a-zA-Z_0-9:,]*</param>
</data>
</define>
<define name="CONTAINER-ACTION">
<choice>
<value>resize</value>
<value>clear</value>
<value>push</value>
<value>pop</value>
<value>find</value>
<value>insert</value>
<value>erase</value>
<value>change-content</value>
<value>change-internal</value>
<value>change</value>
</choice>
</define>
<define name="CONTAINER-YIELDS">
<choice>
<value>at_index</value>
<value>item</value>
<value>buffer</value>
<value>buffer-nt</value>
<value>start-iterator</value>
<value>end-iterator</value>
<value>iterator</value>
<value>size</value>
<value>empty</value>
</choice>
</define>
</grammar>