通常,我们不编写有关新版本PVS-Studio分析仪发行的说明。 但是,新版本包含许多有关C和C ++代码分析的有趣更改,我们希望向用户介绍这些更改。
Java即将推出
老实说,PVS-Studio的最新和最有趣的创新仍然被隐藏。 我的意思是Java语言分析器中的支持。 目前还没有用于Java的PVS-Studio的公开测试版,但即将推出。 如果您想参加其测试,可以给我们写信寻求
支持 (选择:我想要一个Java分析器)。
C和C ++的新诊断
在新版本中,我们有些不高兴,并立即添加了15个针对C和C ++(V1021-V1035)的通用诊断程序。 在次要版本中,从未一次添加太多诊断程序。 有关每种诊断的更多详细信息,请参见
文档 。 我认为,新诊断中最有趣的是:
- V1026。 该变量在循环中递增。 如果有符号整数溢出,则会发生未定义的行为。
- V1033。 变量在C中声明为auto。其默认类型为int。
根据论坛
linux.org.ru上的
讨论创建的Diagnostics
V1026 。 程序员抱怨GCC 8编译器出现故障,但后来发现,故障是代码不正确,导致行为未定义。 让我们看看这种情况。
注意事项 在最初的讨论中,变量
s为
const char * s类型。 此外,在目标平台上,
char类型是无符号的。 因此,为清楚起见,我立即在示例中写道,指针的类型为
const unsigned char * 。
int foo(const unsigned char *s) { int r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return r & 0x7fffffff; }
编译器不会为按位AND运算符(&)生成代码。 因此,该函数返回负值,尽管这不是程序员的本意。
开发人员认为这是编译器中的故障。 但是编写此类代码的程序员实际上是错误的。 由于未定义的行为在其中发生,该功能无法正常工作。
编译器发现变量
r中考虑了一定数量。 变量
r不会溢出。 否则,这是未定义的行为,编译器不应考虑和考虑。 因此,编译器认为,由于循环结束后变量
r中的值不能为负,因此用于重置符号位的操作
r&0x7fffffff是多余的,并且编译器仅从函数中返回变量
r的值。
Diagnostics V1026仅用于检测此类错误。 要修复代码,使用无符号变量读取哈希就足够了。 更正的代码版本:
int foo(const unsigned char *s) { unsigned r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return (int)(r & 0x7fffffff); }
现在让我们看一下另一个
V1033诊断程序。 有趣的是,可能的错误原因是在C ++ 11中出现的新的
auto关键字。 有罪的不是C ++ 11语言本身的创新,而是心理计划的细微差别:)。 我现在解释。 看一下这段代码:
float d = 3.14f; int i = 1; auto sum = d + i;
将其视为错误? 想一想。 这是一张图片,因此您无需立即阅读本文。
猜猜可能有什么问题吗? 如果没有,这里是一些更有趣的信息。
总和变量将为4,而不是4.14。 怎么了
现在读者会说这是不诚实的谜语! 事实是,这不是C ++,而是C。
碰巧在一个项目中同时使用了C ++和旧的C,程序员习惯了在C ++中使用
auto并偶然在C中使用了这个词,但这仅意味着完全不同:
汽车将局部变量定义为具有局部生存期。 关键字自动使用以下语法: [auto] data-definition;
由于本地生存期是本地变量的默认设置,因此很少使用auto关键字。事实证明,变量
sum的类型为
int ,这就是为什么其值将为4的原因。
尽管该错误看起来似乎很奇怪,但实际上,在一个混合使用C和C ++文件的项目中,它很容易制作。 因此,在分析C文件时,PVS-Studio会警告此类可疑结构。
其他创新
添加了
检查 Waf构建系统
项目的功能。
我们将继续向嵌入式系统
开发分析仪。 该版本增加了对GNU Arm嵌入式工具链,Arm嵌入式GCC编译器的项目验证支持。
现在,当分析Visual C ++编译器的项目(cl.exe,Visual Studio / Standalone的vcxproj项目)时,分析器报告现在将寄存器存储在已检查文件的路径中。 从侧面进行细化看起来比实际要容易。 预处理文件时,cl.exe编译器会破坏文件名的大小写。 而且您必须将它们还原回分析仪。
增加了在Windows上使用CLMonitor / Standalone中的pvsconfig文件的功能。
为pvs-studio-analzyer / CMake模块添加了增量分析模式。 现在可以在Windows上将PVS-Studio CMake模块用于使用Visual C ++编译器(cl.exe)的项目。
添加了对.NET Core / .NET Standard Visual Studio项目的增量分析的支持。
网站连结
- PVS-Studio。 版本历史记录 。
- 安德烈·卡波夫(Andrey Karpov)。 未定义的行为比您想像的要近 。
- Will Dietz,Peng Li,John Regehr和Vikram Adve。 了解C / C ++中的整数溢出 。
- Egor Bredikhin。 开发新的静态分析仪:PVS-Studio Java 。