gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:28:55 27 4
gpt4 key购买 nike

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

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

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

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

问候

最佳答案

如果可能,请避免将其具体视为“LLP64”,并使用提供的数据类型(uintptr_tsize_t 等),也可以使用以下代码:其他地方应该是正确的。特别是不要假设 long 是 64 位。

I think i need at least a parse tree / AST along with a symbol table.

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

<小时/>

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

auto x = (SomeTypeDefedThing)*some_pointer;
int y = some_long;
warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]warning: conversion to ‘int’ from ‘long int’ may alter its value [-Wconversion]

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

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

<小时/>

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

<小时/>

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

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

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

关于c++ - 64 位移植 c++ - 跟踪基本类型、指针、算术的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59306853/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com