【问题标题】:64 Bit Porting c++ - track usage of fundamental types, Pointers, arithmetics64 位移植 c++ - 跟踪基本类型、指针、算术的使用
【发布时间】:2020-04-05 23:29:18
【问题描述】:

我们正在使用 gcc/linux 从 32 位移植到 LP64。我正在寻找一种方法来跟踪内存布局(long,Ptr)中更改的数据类型的使用情况。 我对与这些类型的所有可能有问题的“交互”的位置感兴趣。

Typedef 需要取消引用到内置类型,如 ULONG 和 DWORD -> unsigned long 可能的问题可能是:旧式强制转换、重新解释强制转换、算术、上溢/下溢、赋值、比较、常量、ptr 算术、sizeof、size_t 算术、隐式对话...... younameit。

因为这对正则表达式来说不是一件小事,而且代码库很大,所以我需要以某种方式自动化它。 我想我至少需要一个解析树/ AST 以及一个符号表。 我在不同阶段尝试了一些 GCC 的内部树转储,但仍然没有任何线索。 我还启用了编译器必须提供的所有警告;-) 也许任何人都可以给我一个提示在哪里寻找。 (我已经看到了这个看起来很有前途的语义设计工具包)

你是怎么做到的?尝试、测试、失败并处理错误? 我试试clang...

问候

【问题讨论】:

  • 这最好使用libclangclang 工具链/生态系统来完成。我还没有听说过有人编写基于 gcc AST 的 C++ 工具,虽然这些可能存在,但clang AST 访问绝对是你想看的。
  • 在 C++ 中,“原子类型”通常表示 std::atomic<>。我想你的意思是别的。此外,您声明您正在移植到 LLP64,但随后声称 long 更改为 64 位。这是错误的,在 LLP64 中 long 保持在 32 位。 64 位类型是long long 和指针,因此是 LLP。
  • @MSalters 正如你所怀疑的,我的意思是内置 C 原语 ;-) int,char,short,long,float,double。在我的例子中,long 和 Ptr 从 4 字节变为 8 字节。所以它是 LP64 然后...更新了问题。

标签: c++ types 64-bit abstract-syntax-tree porting


【解决方案1】:

如果可能,请避免将其专门视为“LLP64”,并使用提供的数据类型(uintptr_tsize_t 等),还不如拥有在其他地方应该正确的代码。尤其不要假设 long 是 64 位。

我认为我至少需要一个解析树/AST 以及一个符号表。

我认为不存在完美的解决方案,已经有一些静态分析工具可供您搜索,可以用来捕捉许多可能的错误,但有些事情仍然过去了,检测其中一些问题所需的敏感度级别可以提供很多误报。


编译器可以检测到您可以使用自己的解析器轻松找到的基本内容,例如:

auto x = (SomeTypeDefedThing)*some_pointer;
int y = some_long;
警告:从指针转换为不同大小的整数 [-Wpointer-to-int-cast]
警告:从“long int”转换为“int”可能会改变其值 [-Wconversion]

显式整数转换是一个更大的问题,如果您有x = (int)yx = (long)y 等,编译器只是假设您的意思是转换,并且确定y 是否超出范围确实很棘手。

虽然您可以在静态分析中找到这一点,但我预计这样的警告会非常嘈杂,因为这样的显式转换通常确实想要这样做。


如果您正在执行任何二进制文件或网络 IO,这可能是个问题。理想情况下,它将使用已经提供的类型编写,以便在不同的实现之间正常工作。这样的代码可以有多种形式,很难简单地搜索,但如果你知道你的程序确实做了这样的文件或网络事情,它应该很容易识别和手动检查。


如果您确实需要寻找在您的代码中非常常见但未被预先存在的编译器和静态分析工具检测到的特定模式,那么也许将您自己的模式放在一起会有所帮助。

Clang 提供了许多有用的库和工具可供查看。虽然 GCC(以及 MSVC 等其他工具链)可能具有您可以解析的中间文件格式,但我没有看到它们被使用过,而且关于这些的文档(如果完整的话)似乎要少得多。

他们有一个介绍文档,你可以通过使用-ast-dump 编译来获得 ast。 https://clang.llvm.org/docs/IntroductionToTheClangAST.html

【讨论】:

    【解决方案2】:

    对于正确的移植:

    1. 阅读Lessons on development of 64-bit C and C++ applications
    2. 尝试 PVS-Studio 诊断 (the 64-bit rule set) (free license)。

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多