3

我们都知道 C 编译器会输出汇编。

但是,我正在研究我的工具只接受 ANSI C 的一个狭窄子集。是否有任何 C-to-C 翻译器可以内联函数或展平结构,但写出 C 代码?

任何其他可以简化 C 代码的工具,让我听听。

4

5 回答 5

7

LLVM 支持这样的东西

于 2011-06-19T15:50:04.800 回答
1

如果您不需要生成的 C 代码特别可读,则可以使用常规编译器生成二进制可执行文件,然后使用反编译器从二进制生成 C 代码。反编译器很可能无法“内联”编译器内联的函数。虽然不确定结构,但如果您在没有调试符号的情况下进行编译并使用不太复杂的反编译器,它可能根本无法检测到结构。

于 2011-06-19T15:43:48.407 回答
1

据我所知,Clang 可以将它的 AST 翻译回 C,从 Internet 上的各种来源。

于 2011-06-19T15:49:27.477 回答
0

旧的 MIT 项目 C2C(在 FTP 上使用了一段时间)和较新的 Cilk 使您可以运行 C->AST->C 进程。

Cilk 和 Cilk++ 得到积极维护。它们包括一个非常好的 ANSI C 解析器。

于 2011-06-23T10:50:34.173 回答
0

我们的DMS 软件再造工具包及其C 前端可以做到这一点。

DMS 提供用于解析、构建 AST、符号表、一般分析 AST 的通用机制,以及用于控制/数据流/指向/值范围的特定分析器,以及以程序或使用模式任意转换 AST,以及源文本的再生,包括评论。DMS 同时处理多个编译单元的能力允许同时影响多个编译单元的全局分析器和转换。

DMS 的 C 前端专门针对 C 的所有这些(它具有各种其他语言的前端)。它处理各种方言,包括 ANSI、GCC 3/4、MS Visual C 和 Green Hills C;可以根据需要为其他方言定制。

DMS 已被用于各种 C 分析/转换项目,包括分析一个 2600 万行的软件系统。

DMS 的一个有趣应用是检测 C 源代码以在指针错误发生时捕获它们(而不是遭受长时间延迟的崩溃);请参阅我们的CheckPointer工具。这个工具读取源代码,插入额外的代码来检查每个指针的访问,然后写出结果。在此过程中,它将 C 代码规范化为简化的子集,以消除许多特殊情况。这种标准化可能非常接近 OP 想要做的事情。

于 2011-06-27T21:38:38.917 回答