代码之家  ›  专栏  ›  技术社区  ›  Suma

由于LargeAddressware而检测指针算法

  •  8
  • Suma  · 技术社区  · 15 年前

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

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

    如果没有,是否有一些“最少努力”的手动或半自动方法来实现这一点?

    5 回复  |  直到 6 年前
        1
  •  3
  •   Patrick    15 年前

    PC-lint可以发现这种问题。

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

    应用于指针的减法运算符 --的表达式 在P和Q都是指针的地方找到了形式P-Q。这是 在最大指针可以 溢出保存指针差异的类型。例如, 假设最大指针是3GB-1,那么 指针差异用长表示,其中 最大限度 long为2 GB-1。注意这两个数量都适合 在32位字内。然后从中减去一个小指针 非常大的指针将在 表示指针差的长。相反地, 从一个小指针中减去一个非常大的指针可以产生 正数量。

        2
  •  1
  •   Christopher    15 年前

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

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

        3
  •  0
  •   Patrick    15 年前

    只有当两个指针相距超过2000万字节(2GB)时,这才是一个问题。这意味着你:

    • 要么有非常大的阵列(>2GB)
    • 或者是减去指向完全不同结构的指针

    所以,看看这些特殊情况。

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

        4
  •  0
  •   Suma    15 年前

    由于我们的代码已经与gcc一起编译,我认为最快的方法可能是:

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

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

    将警告添加到:

    • C型(C型) pointer_diff 函数
    • C型/ C型(C型) 波特尼迪夫 函数)。

    除了直接检测指针减法,还有一件事要做,那就是检测先将指针转换为整数类型,然后再减法的情况。这可能更困难,这取决于您的代码是如何结构的,在外面的情况下,regexp搜索(。 ItPrTrt)。 -.*-(*intptr\u t)工作得很好。

        5
  •  0
  •   Simpleton    6 年前

    不管它值多少钱,我都经历了 Microsoft compiler warning docs for VS2017 并搜索所有涉及“signed”、“trunc”(截断)和“conv”(转换)的警告,这些警告高于警告级别1。然后,我通过一个属性表明确地为解决方案中的所有项目启用了这些警告。若要启用特定的警告,请转到“C/C++ +命令行/附加选项”,并将它们添加到格式/WLγ*中,其中L是您要将它们分配给的警告级别,而“γ”是警告号。

    所以我想到的是这个列表:

    /w14365/w14018/w14146/w14245/w14092/w14287/w14308/w14388/w14389/w14757/w14707/w14302/w14305/w14306/w14307/w14308/w14309/w14310/w14311/w14312/w14051/w14055/w14152/w14239/w1423/w14242/w14243/w14244/w14254/w14267/w1433/w1434/w1434/w1437/w14686/w14826

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

    这导致超过88000个警告,其中大多数是关于在使用stl的代码中使用in t而不是size_t,以及有关Windows API类型(如句柄、wParams和uint_ptrs等)的转换。在第三方库中,我只发现了一些与实际指针算法相关的警告,但在上下文中,这些警告看起来还不错。

    不管怎样,我认为这个相关警告列表可能对某些人有所帮助。

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

    另一种选择是根据 CppCoreGuideLines . 转到“主菜单/分析/配置代码分析/解决方案”,并为所有要分析的项目选择“C++核心检查原始指针规则”。然后是“主菜单/分析/运行代码分析/用于解决方案”。注意:修改项目,需要很长的时间来构建,可能会生成很多警告。您可能希望将精力集中在c26481“不要使用指针算术”和c26485“没有数组到指针衰减”。