四、同类规则效果对比分析 本文针对每个工具在关键报错项,如:空指针、越界、变量未初始化、内存泄露、逻辑上的报错结果进行分析。 样本代码--3款游戏项目(约500万行代码)代码 测试对象--tscancode2.0、coverity7.5、cppcheck1.68、pclint9.0、clang3.4 有效报错数--某类规则在3款游戏项目的有效报错数总和 准确率--某类规则在3款游戏项目的平均准确率,准确率=有效报错数/报错总数*100% 综合评分--综合有效报错数和准确率的评分,有效报错数和准确率的权值暂定为45:55,综合评分=有效报错/最大有效报错数*100*45%+准确率*100*55% 4.1空指针规则 空指针检查规则主要检查是否存在对赋值为空的指针解引用的情况,空指针是c/c++中最大的问题,经常造成程序崩溃的致命错误。因此,C++静态代码分析工具对空指针的检查能力显得尤为重要。 图为五个工具对样本代码扫描结果: 从报错数量和准确率来看: 有效报错数:TSC [401] >coverity[219]>>clang[57] >cppcheck[20]>pclint[14] 准确率:coverity[95%]≈TSC[92%] ≈clang[90%]>>cppcheck[28%]>pclint[14%] 综合评分:TSC[96分] >coverity[77分] >clang[56分]>cppcheck[18分]>pclint[8分] 1、从准确率来看,在空指针检查方面,不考虑扫描效率和扫描环境搭建复杂度,TSC、coverity和clang都很优秀,三者准确率都很高。cppcheck, pclint在结果准确率上和数量上都较差,不推荐使用。 2、从空指针规则细分程度来看,TSC和coverity相当,细分场景挖掘更多,cppcheck规则并未细分空指针规则,从实际项目结果来看,只能检查出dereferenceBeforeCheck场景的错误。Clang和pclint在空指针细分上维度跟TSC和coverity不同,比如:它们区分是参数指针解引用还是局部变量解引用,细分粒度不够且覆盖场景较少,其覆盖场景基本都被TSC和coverity包含。 cppcheck扫描出来的问题存在大量误报,误报主要是冗余的判空,并不会引起实际问题,具体误报场景如下: 3、从有效报错数量上,TSC有效报错数量更多,细分场景挖掘更多,无疑是扫描空指针最佳选择;clang覆盖的场景较少,其有效报错基本都能被coverity和TSC覆盖,不过由于其准确率较高且免费,与TSC搭配使用也是不错的选择;而coverity虽然覆盖场景多但因为只会报完全可信的问题,因此会漏掉部分有效报错,例如:指针变量来源于函数返回值,而函数返回值是否为NULL依赖于用户输入,在静态分析中coverity无法判断其是否会为NULL,为保证准确率会漏掉该指针报错。若项目对空指针漏报容忍度较高,且有足够预算采购商业软件,可以选择coverity;而cppcheck和pclint检查出的有效问题极少并伴随大量误报,同上结论,不宜使用。 4、在易用性上,coverity和clang编译环境构建复杂,编译时长增加较多;TSC在易用性上也有一个缺点,即为提高准确率,在个别项目存在一次性配置工作。原因是个别项目存在自定义判空宏,但由于不依赖编译,TSC扫描的代码可能并不完整,导致个别自定义判空宏找不到,需要在cfg.ini中配置自定义判空宏。当然,如果扫描的代码完整度同编译环境,则无此问题。 4.2越界规则 越界一般来讲是指数组下标越界,或者缓冲区读写越界。这类错误会导致非法内存的访问,引发程序崩溃或者错误。 ...... 本文收录于《测试专刊-腾讯WeTest教你玩转手游测试》。 版权声明:本文出自《测试专刊-腾讯WeTest教你玩转手游测试》。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
|