我正在寻找一种方法来检测或缓解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;
}
编译这个程序应该生成一个巨大的,语法正确的if-else树(适用于较小的版本;比如说,直到A10);如果被执行,它会轻易打印出2 ^ 30&#34; hello world&#34;该树中的字符串。但是,尝试在8GB计算机上进行编译会导致无响应的行为,并且(稍后)会显示以下错误:
internal compiler error: Segmentation fault
A0
^
是否可以使用GCC 4.9.x限制上述情况下的预处理器扩展,或者避免使用此类程序崩溃?
答案 0 :(得分:1)
据我所知,使用简单的gcc命令无法实现您想要实现的目标。 绕过它可能会在构建系统中添加一些额外的步骤,以查看提交是否将代码库增加了一定的百分比。
gcc中有一个选项(-E),它在预处理器步骤之后输出代码。
如果你在commit 1有一个构建,你可以保存该提交的行数,用-E运行gcc,并在其输出上执行“wc -l”。
在提交2中,在构建之前,你也会这样做,并检查行数是否增加了你定义的阈值(10%,20%?)