由于LARGEADDRESSAWARE,检测指针算术

时间:2010-06-16 09:23:33

标签: c++ visual-studio pointers static-analysis

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

  

应用于指针的减法运算符    - 表达的         形式p - q被发现p和q都是指针。这是         在最大指针可以的情况下特别重要         溢出保存指针差异的类型。例如,         假设最大指针是3千兆字节-1,那就是         指针差异由long表示,其中   最大值         长是2千兆字节-1。请注意,这两个数量都适合         在32位字内。然后从a中减去一个小指针         非常大的指针会产生明显的负值         long表示指针差异。反过来,         从小指针中减去一个非常大的指针就可以产生         积极的数量。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

所以寻找这些特殊情况。

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

答案 3 :(得分:0)

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

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

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

将警告添加到:

  • c-typeck.c(pointer_diff function)
  • cp / typeck.c(pointer_diff function)。

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

答案 4 :(得分:0)

无论价值多少,我都经过Microsoft compiler warning docs for VS2017并搜索了所有高于“警告”级别1的警告,这些警告均涉及“签名”,“截断”(截断)和“转换”(转换)。然后,我通过propsheet明确为解决方案中的所有项目启用了这些警告。要启用特定警告,请转到“ 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的警告,以及有关诸如句柄,WPARAM和UINT_PTRs之类的Windows API类型的转换。我在第三方库中只发现了一些与实际指针算术有关的警告,但在上下文中看起来还不错。

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

也请使用此答案中描述的工具:https://stackoverflow.com/a/22745579/9635694

另一个选择是根据CppCoreGuideLines运行内置代码分析。转到“主菜单/分析/配置代码分析/用于解决方案”,然后为要分析的所有项目选择“ C ++核心检查原始指针规则”。然后是“主菜单/分析/运行代码分析/用于解决方案”。当心:修改您的项目,需要很长时间才能构建,并且可能会产生很多警告。您可能要集中精力在C26481“不要使用指针算术”上,也许在C26485“不使用数组到指针的衰减”上。