检测导致大量扩展代码大小的C/C++预处理程序滥用

tuc*_*uxi 10 c++ gcc c-preprocessor

我正在寻找一种方法来检测或缓解C++源代码,当预处理时,它扩展为巨大的大小,以便GCC耗尽内存.

示例代码:

#include <iostream>
using namespace std;
int main() {
    #define A30 cout << "hello world";
    #define A29 if (1) { A30 } else { A30 }
    #define A28 if (0) { A29 } else { A29 }
    // ... you get the idea ... 
    #define A1 if (1) { A2 } else { A2 }
    #define A0 if (0) { A1 } else { A1 }
    A0
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译这个程序应该生成一个巨大的,语法正确的if-else树(适用于较小的版本;比如说,直到A10); 如果执行,它可以轻松打印该树中的2 ^ 30个"hello world"字符串之一.但是,尝试在8GB计算机上进行编译会导致无响应的行为,并且(稍后)会显示以下错误:

internal compiler error: Segmentation fault
A0
^
Run Code Online (Sandbox Code Playgroud)

是否可以使用GCC 4.9.x限制上述情况下的预处理器扩展,或者以其他方式避免与此类程序崩溃?

dau*_*ama 1

据我所知,没有办法用简单的 gcc 命令来完成您想要实现的目标。解决这个问题的方法也可以是在构建系统中添加一些额外的步骤,以查看提交是否使代码库增加了一定的百分比。

gcc 中有一个选项 (-E),可以在预处理器步骤之后输出代码。

如果您在提交 1 处进行了构建,则可以保存该提交处的行数,使用 -E 运行 gcc,并在其输出上执行“wc -l”。

在提交 2 中,在构建之前,您执行相同的操作,并检查行数是否没有增加您定义的阈值(10%、20%?)