检测C/C++预处理器滥用,导致巨大的扩展代码大小

我正在寻找一种方法来检测或减轻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“hello world”字符串之一.但是,尝试在8GB机器上进行编译会导致无响应的行为(稍后)会显示以下错误

internal compiler error: Segmentation fault
A0
^

在上述情况下,是否可以使用GCC 4.9.x来限制预处理器扩展,否则可以避免使用这样的程序崩溃?

解决方法

据我所知,没有办法通过简单的gcc命令来做你想要实现的工作.
围绕它的方法可能会在构建系统中增加一些额外的步骤,以查看提交是否将代码基础增加了一定百分比.

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

如果您在提交1中有一个生成,那么可以在该提交中保存行数,并使用-E运行gcc,并在其输出上执行“wc -l”.

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...