【发布时间】: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...
问候
【问题讨论】:
-
这最好使用
libclang和clang工具链/生态系统来完成。我还没有听说过有人编写基于 gcc AST 的 C++ 工具,虽然这些可能存在,但clangAST 访问绝对是你想看的。 -
在 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