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

时间:2015-04-17 13:44:53

标签: 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;
}

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

internal compiler error: Segmentation fault
A0
^

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

1 个答案:

答案 0 :(得分:1)

据我所知,使用简单的gcc命令无法实现您想要实现的目标。 绕过它可能会在构建系统中添加一些额外的步骤,以查看提交是否将代码库增加了一定的百分比。

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

如果你在commit 1有一个构建,你可以保存该提交的行数,用-E运行gcc,并在其输出上执行“wc -l”。

在提交2中,在构建之前,你也会这样做,并检查行数是否增加了你定义的阈值(10%,20%?)