gpt4 book ai didi

python-2.7 - Pycparser 无法处理预处理代码

转载 作者:行者123 更新时间:2023-12-05 01:02:41 49 4
gpt4 key购买 nike

我需要在预处理的 C 代码上使用 pycparser(由 'gcc -E' 产生的结果)。但是我目前遇到了我无法理解或解决的问题。

我正在使用提供的示例 year2.c 和 func_defs.py,我对其进行了修改以使用各种预处理器和假库,但无济于事。也许你们中的一些人可以调查一下,看看是否可以重现/解决问题。我将附加所有必要的代码。

错误是使用 year2.c(常规示例文件)和 year2.i('gcc -E' 输出)生成的。后者没有可用的结果,而前者同时使用预处理器/fakelib 变体。

我创建了一个包含所有相关错误的 bitbucket 存储库、使用的脚本(尽管只是它的最后一个变体)以及 year2.c 和 year2.i 文件。

Error & Sample Repo

感谢您的宝贵时间。

最佳答案

你得到的错误是:

pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h:40:27: before: __gnuc_va_list

指示为导致错误的行 (stdarg.h:40):

typedef __builtin_va_list __gnuc_va_list;

在 gcc 中,__builtin_va_list顾名思义,它内置于编译器中。因此,不需要(或不允许)声明该类型。

C 编译器使用基于符号表的技术来解析类型名是很常见的,因为如果您无法将类型名与另一个标识符区分开来,语法中就会出现许多歧义。这样的解析器将假定未声明的标识符不是类型名,如果 __builtin_va_list不是类型名,即 typedef是语法错误。

所以我想你使用的 pyparser 语法不知道 gcc 内置类型(为什么要知道?)。

您的 fakelib 似乎包含相同的头文件。这并不奇怪,因为很难伪造 stdarg.h ;虽然在技术上是一个库头文件,但它是编译器必须提供的一小部分头文件,即使在独立(非标准库)实现中也是如此:<float.h>, <iso646.h>, <limits.h>, <stdalign.h>,
<stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>
, 和 <stdnoreturn.h> (C11 标准,第 4 条,第 6 段)。这些必须由编译器实现,因为外部库无法充分了解已编译代码的性质以正确定义它们。

根据您对 pyparsed 输出的要求,您可以通过包含 __builtin_va_list 的定义来解决 pyparser 的问题。 ,如:

typedef struct __builtin_va_list { } __builtin_va_list;

__builtin_va_list不是唯一的内置 gcc 数据类型,尽管您可能不会遇到其他数据类型。因此,您可能需要多次迭代此解决方案,直到实现您想要实现的目标。

关于python-2.7 - Pycparser 无法处理预处理代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983726/

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