对PVS-Studio的独立审查(Linux,C ++)

我看到了PVS确实学会了在Linux下进行分析的出版物,并决定尝试其项目。 这就是结果。



目录内容


  1. 优点
  2. 缺点
  3. 总结
  4. 后记


优点


响应式支持


我索取了一把试用钥匙,他们在同一天将其发送给了我。


清除足够的文档


可以启动分析仪而没有任何问题。 控制台命令的帮助也可用(尽管有投诉,请参见“ 缺点”部分)。


多线程分析能力


分析仪具有“标准”选项-j ,它允许在多个任务中并行分析。 这样可以节省大量时间。


良好的可视化


从文本到小型网络枪口,许多不同的输出格式。 Web界面非常方便,简洁,在代码行和诊断说明的链接旁都有提示


易于组装的整合


所有文档都在其网站上,我只能说,如果您的项目是使用CMake构建的,那么一切都非常简单。


良好的诊断说明


如果以fullhtml模式生成输出,则每个消息都具有指向诊断说明的链接,包括说明,代码示例和其他链接。



缺点


C ++语言分析器无知


不幸的是,PVS有时会在语法上出错,并使用完全正确的代码生成误报消息。


例如,有一个函数返回void


 template <typename T> auto copy (const void * source, void * destination) -> std::enable_if_t < std::is_copy_constructible<T>::value > { new (destination) T(*static_cast<const T *>(source)); } 

是的,关键字auto可以表示void ,这就是为什么auto的原因。 但是PVS发出了以下消息:


 dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value. dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths. 

很慢的网站


是的,在每个消息旁边的Web界面中,都有一个指向诊断的相应描述以及示例的链接。 但是,当您单击链接时,您必须等待足够长的时间,有时会发生504 Gateway Time-out


语言能力


所有描述都是俄语,太好了。 但是,报告中的链接始终指向英文版本。 能够切换语言非常好,这样您就可以立即以俄语查看诊断信息。 我没有在界面中找到这样的机会。


不方便通过控制台使用诊断级别


首先,使用的两个命令( pvs-studio-analyzerplog-converter )具有不同的诊断作业格式。


pvs-studio-analyzer的帮助如下:


 -a [MODE], --analysis-mode [MODE] MODE defines the type of warnings: 1 - 64-bit errors; 2 - reserved; 4 - General Analysis; 8 - Micro-optimizations; 16 - Customers Specific Requests; 32 - MISRA. Modes can be combined by adding the values Default: 4 

很长时间以来,我试图了解在何处添加 (“添加值”)键。 试图用逗号列出:


 pvs-studio-analyzer analyze ... -a 1,4,16 

我尝试几次注册密钥:


 pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16 

直到那时我才意识到这些都是位掩码! 您需要总结 ,而不是增加价值。 例如,要获取常规诊断,微优化诊断和MISRA,您需要将它们相加(4 + 8 + 32 = 44):


 pvs-studio-analyzer analyze ... -a 44 

在用户界面中使用位掩码通常不是一个好主意。 所有这些都可以在内部进行总结,并且用户可以设置一组标志。


此外,还有plog-converter实用程序,该实用程序生成有关静态分析的人类可读信息。 她还有其他麻烦。


plog-converter程序报告的帮助:


 -a, --analyzer Specifies analyzer(s) and level(s) to be used for filtering, ie 'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2' Default: GA:1,2 

这里出现了某种“级别”,这是以前从未见过的,我也没有在文档中找到关于它们的任何信息。


一般来说,还不清楚。 因此,我将一切都设置为最大。


一堆愚蠢的宣誓就职


我分析的三个项目中有两个使用Catch2单元测试 。 大部分信息(一种形式的138个中的90个,另一个形式的344个中的297个!)具有以下形式:


渔获2


不考虑多线程


关于假定不变的变量或无限循环,存在许多误报,而使用这些变量来自不同的线程,如果不是这样,则单元测试将无法工作。


多线程


但是,静态分析仪可以完全考虑到这一点吗? 我不知道



总结


PVS在我的开放项目BurstProxima以及工作草案中没有发现任何真正的错误,出于明显的原因,我无法提出这个错误。 没错,应该牢记一些缺陷已经在早期使用Cppcheckscan-build修复了。


通常,所有这些分析器的印象都是相同的:是的,它们捕获了某些东西,有时甚至是重要的东西,但总的来说,编译器就足够了。


我们的团队有可能(并且我个人很高兴如此认为)使用此类软件开发实践,使我们能够产生最少的垃圾。 最好不要制造问题,而要勇敢地克服它们。


因此,我可以自由地就如何用C ++编写代码提供一些建议,以免射击任何人的腿,也不用前额耙。


最大限度地使用编译器诊断


我们的团队使用(并为您提供建议)以下编译选项:


 -Werror -Wall -Wextra -Wpedantic -Wcast-align -Wcast-qual -Wconversion -Wctor-dtor-privacy -Wenum-compare -Wfloat-equal -Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wsign-conversion -Wsign-promo 

将它们包括在您的项目中,了解很多关于您的代码的知识。


坚持标准


如果有标准的类似物,请尽量不要使用平台相关的东西,如果您根本不能使用它们,请将它们包装在宏的特殊块中(或以某种方式),并且不要让我们在不受支持的条件下编译您的代码。


坚持标准操作语义


加法必须是加法,乘以乘法,函数必须按函数调用,复制必须复制,转移必须转移,容器必须可迭代,迭代器必须具有++提升和取消引用* 。 依此类推。


我认为这个主意很明确。 已经建立的协议没有约束力,但是您的代码的所有用户和读者都希望看到。 不要试图以智取胜,否则要超越自己。


编写兼容的代码


首先,我的意思是标准库。 非常希望您的类和函数的接口可以与标准库和其他库(例如Bust)一起使用。


随意浏览STL和Boost接口。 除了极少数的例外,您将在那里看到值得的榜样。


充分利用开放式工具


对于相同的静态分析,至少有两个开放的免费工具可以通过CMake构建系统连接到任何项目,而这要花费大量的时间。


您可以在我最近的出版物中阅读有关此内容的更多信息



后记


总之,我强调我不敦促不要使用PVS或任何其他静态分析仪。 但我敦促您考虑一下,事实证明静态分析器会不断发现代码中的重大错误。


这仅仅是后果。 有必要寻找并消除原因。

Source: https://habr.com/ru/post/zh-CN463027/


All Articles