PVS-Studio 6.26发行

PVS-工作室6.26

通常,我们不编写有关新版本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编译器出现故障,但后来发现,故障是代码不正确,导致行为未定义。 让我们看看这种情况。

注意事项 在最初的讨论中,变量sconst 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。 怎么了

Xs

现在读者会说这是不诚实的谜语! 事实是,这不是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项目的增量分析的支持。

网站连结


  1. PVS-Studio。 版本历史记录
  2. 安德烈·卡波夫(Andrey Karpov)。 未定义的行为比您想像的要近
  3. Will Dietz,Peng Li,John Regehr和Vikram Adve。 了解C / C ++中的整数溢出
  4. Egor Bredikhin。 开发新的静态分析仪:PVS-Studio Java

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


All Articles