我看到了PVS确实学会了在Linux下进行分析的出版物,并决定尝试其项目。 这就是结果。
目录内容
- 优点
- 缺点
- 总结
- 后记
响应式支持
我索取了一把试用钥匙,他们在同一天将其发送给了我。
清除足够的文档
可以启动分析仪而没有任何问题。 控制台命令的帮助也可用(尽管有投诉,请参见“ 缺点”部分)。
多线程分析能力
分析仪具有“标准”选项-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-analyzer
和plog-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个!)具有以下形式:

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

但是,静态分析仪可以完全考虑到这一点吗? 我不知道
PVS在我的开放项目Burst和Proxima以及工作草案中没有发现任何真正的错误,出于明显的原因,我无法提出这个错误。 没错,应该牢记一些缺陷已经在早期使用Cppcheck和scan-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或任何其他静态分析仪。 但我敦促您考虑一下,事实证明静态分析器会不断发现代码中的重大错误。
这仅仅是后果。 有必要寻找并消除原因。