64 位移植 c++ - 跟踪基本类型、指针、算术的使用

swa*_*ing 3 c++ 64-bit porting types abstract-syntax-tree

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

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

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

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

问候

Fir*_*cer 6

如果有可能,避免思维“LLP64”明确,并使用数据类型提供的(uintptr_tsize_t,等),可能也有一些代码应该是正确的别处。尤其不要假设long是 64 位。

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

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


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

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

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

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


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


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

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

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