目录

一、前言

二、QAC构建

三、QAC常见报警


一、前言

QAC和Klockwork都属于静态代码检测并且检测方法日趋于后者,polyspace是动态检测,包括各种条件真假在板子上的实时运行情况。QAC是什么?你把源码文件给它(包括编译器),它根据定义的规则分析,然后根据输出警报的配置选择输出还是抑制,最后输出报告。

Compiler personality:反应编译器配置选项

Analyser personality:定义与项目相关的分析选项

Message personality:定义启用的警报消息及如何显示输出

二、QAC构建

使用QAC8.1新建工程一般包括源码路径,报告输出路径及3个个性化配置文件导入Message(.p_s),Analyser(.p_a),Compilier(.p_c)

2.1 Message

Message用来控制警报消息的显示,将报警按照严重等级分为10级(0-9)。

-n  xxx抑制编号为xxx的警报消息输出-max 显示最多警报消息出现次数,一般 -max 0
-o xxx选择编号为xxx的警报消息输出-format消息的输出格式
-summ创建分析总结-up用户消息文件路径
-hdr显示Header头警报-emhm消息扩展列表,如-emhm  1151, 1123
-hw显示抑制警报消息-usr 
-l显示行号-m- 
-st显示最高报警等级-one- 

上面的选项后面可以添加+ / -等输入参数,具体含义看user-guide
2.2  Analyser

顾名思义,你把文件告诉它在哪里,根据规则进行分析。

-i 指定头文件(绝对路径) -i "path folder"-ppl处理输出 -ppl+
-q抑制来自路径中头文件的消息 -q "header path folder"-ppf在预处理列表中包含文件名和行号 -ppf+
-d ident[= [ value]]定义宏,如 -d "osType = int",工程宏-ss为更大广度生成无符号到更大有符号消息 -ss+
-op path指定生成输出文件的路径,工程-sr为对等类型生成类型转换消息 -sr-
-sty extented括号style的检测-wc警报调用 -wc abort=5126
-t, -tab, -tabstop指定制表符表示的空格数 -tab 8-spragmapragma block ignore -spragma "asm","endasm"
-il代码紧凑等级 -il 0-threshmetrics阈值 -thresh "STCYC>15"
-mll最大行长度 -mll 0-cocomment count -co a
-enEncoding -en ASC-met , -ppm-met显示metrics, -ppm metrics after preprocessing -met+ -ppm-
-maxerr可中止的最大错误数 -maxerr 0-k+rK&R to ANSI portability

 

2.3 Compilier

-i "path"系统头:文件包含-it wchar_t固有类型:wchar_t
-q "path"系统头:移植输出-s类型大小和对齐:size
-d系统宏定义-a类型大小和对齐:alignment
-ar数据类型:右移行为 -ar+-na标识符:内部标识符有效长度 -na 31
-bits数据类型:位域解释 -bits--xn标识符:外部标识符有效长度 -xn 31
-u数据类型:字符解释 -u+-xc标识符:忽略外部标识符case  -xc-
-fpc数据类型:将普通字符折叠为有符号/无符号类型 -fpc+-ex扩展:扩展类型 -ex asm
-it size_t固有类型:size_t-fi扩展:附加包含文件 -fi "xx.h"
-it ptrdiff_t固有类型:ptrdiff_t        -it "ptrdiff_t=int"-sl扩展:忽略\和换行符之间的空白格 -sl-

 

总结:参考QAC-8.1.1-R下的personalities文件夹和help下的user-guide中附录personalities可以构建自己项目的属性文件(如果前人有这些配置文件,轮子就不用造了,但是要具备造轮子的能力)

三、QAC常见报警

3.1 Msg(2:4700) metric value out of  threshold range: STCYC=22:STLIN=307:STMCC = 48;函数内执行的代码行数少于5,比如一个函数中只有if-else if...或者switch-case

3.2 Msg(2:4304) An expression of 'essentially Boolean type'is being cast to unsigned type;布尔类型表达式转化为无符号整形

void foo (unsigned c);
unsigned f4304(int a , _Bool b)
{
    foo((unsiged)(a<0));/*4304*/
    return ((unsigned)b);/*4304*/
}

3.3 Msg(2:0310) Casting to different object pointer type,指针类型的强制转换导致警报。类型的大小和对齐方式是基于硬件确定的,转换具有严格对齐要求的类型导致不确定的行为。比如一般是4字节对齐,如果在分配中强制定义为1/2/3字节,在程序运行中会出现异常。

extern char *pa;
extern char *pb;
extern int* pia;

extern void foo(void)
{
    pa = (char*)pia; //0310
    pia = (int*)pb;    //0310 & 3305
}

3.4 Msg(3:3305) pointer cast to stricter alignment;如果是4字节对齐片子,在分配了4字节int的前提下,强制转换为char*是安全的。如果地址恰好位于4的倍数上转换为char*是安全的,否则将会出现异常3305。

3.5 Msg(2:3892)The reslut of this cast is implicitly coverted to another type;声明的不同类型,在代码中没有强制转换统一类型导致的警报;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

获取更多汽车电子技术干货

更多推荐