由于LARGEADDRESSAWARE,检测指针算术

问题描述 投票:8回答:5

我想将我的应用程序切换到LARGEADDRESSAWARE。需要注意的一个问题是指针算法,因为指针差异不能再表示为带符号32b。

有没有办法如何在大型C ++项目中自动查找指针减法的所有实例?

如果没有,是否有一些“尽力而为”的手动或半自动方法如何实现这一目标?

c++ visual-studio pointers static-analysis
5个回答
3
投票

PC-Lint可以找到这种问题。

看看http://gimpel-online.com/MsgRef.html,错误代码947:

应用于指针的减法运算符 - 找到p - q形式的表达式,其中p和q都是指针。在最大指针可以溢出保存指针差异的类型的情况下,这一点特别重要。例如,假设最大指针为3千兆字节-1,并且指针差异由long表示,其中最大长度为2千兆字节-1。请注意,这两个量都适合32位字。然后从非常大的指针中减去一个小指针将在表示指针差异的long中产生一个明显的负值。相反,从小指针中减去一个非常大的指针可以产生正数量。


1
投票

使用64位编译器编译代码并打开Wp64。

因为指针是64位宽,但int,long,DWORD等保持32位宽,你会收到警告,将ptrdiff_t缩短为int32_t


0
投票

如果你有两个超过2000万字节(2GB)的指针,这只是一个问题。这意味着你:

  • 要么有非常大的数组(> 2GB)
  • 或者你正在减去指向完全不同结构的指针

所以寻找这些特殊情况。

我认为在大多数情况下这不是问题。


0
投票

由于我们的代码已经与GCC编译,我想也许最快的方法可能是:

  • 建立海湾合作委员会
  • 创建GCC的自定义修改,以便在检测到指针减法时打印警告(或错误)
  • 构建项目并收集有关指针减法的所有警告

以下是GCC需要对此进行的更改概述:

将您的警告添加到:

  • c-typeck.c(pointer_diff函数)
  • cp / typeck.c(pointer_diff函数)。

除了直接检测指针减法之外,另一件事可以是检测首先将指针转换为整数类型然后减去它们的情况。这可能会更困难,具体取决于您的代码结构如何,在regexp搜索(.intptr_t).-。* - (。* intptr_t)的情况下运行良好。


0
投票

无论它值多少,我都通过了Microsoft compiler warning docs for VS2017并搜索了所有警告,指的是“签名”,“截断”(截断)和“转换”(转换),这些警告高于警告级别1.然后我明确启用了这些警告我们的解决方案中的所有项目都通过道具表。要启用特定警告,请转到“C / C ++ /命令行/其他选项”并以格式/ wL ####添加它们,其中L是要分配给它们的警告级别,而####是警告号码。

所以我想出的就是这个清单:

/ w14365 / w14018 / w14146 / w14245 / w14092 / w14287 / w14308 / w14388 / w14389 / w14757 / w14807 / w14302 / w14305 / w14306 / w14307 / w14308 / w14309 / w14310 / w14311 / w14312 / w14051 / w14055 / w14152 / w14239 / w14223 / w14242 / w14243 / w14244 / w14254 / w14267 / w14333 / w14334 / w14367 / w14686 / w14826

请注意,我使用了/ w1,因为我们的全局警告级别已经下降到1(不要判断我,这是遗留问题)。因此,当您将默认警告级别设置为3或更高时,已经启用了其中一些警告。

这导致超过88000个警告,其中大部分是关于在使用STL的代码中使用int而不是size_t以及关于Windows API类型(如句柄,WPARAM和UINT_PTR等)的转换。我只在第三方库中发现了一些与实际指针算术相关的警告,但这些警告在上下文中看起来不错。

无论如何,我认为这个相关警告列表可能对某人有所帮助。

另外,使用本答案中描述的工具:https://stackoverflow.com/a/22745579/9635694

另一种选择是根据CppCoreGuideLines运行内置代码分析。转到“主菜单/分析/配置代码分析/解决方案”,然后为要分析的所有项目选择“C ++核心检查原始指针规则”。然后“主菜单/分析/运行代码分析/解决方案”。注意:修改您的项目,需要很长时间才能构建并可能产生大量警告。您可能希望专注于C26481“不要使用指针算术”,也许C26485“没有阵列到指针衰减”。

© www.soinside.com 2019 - 2024. All rights reserved.