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

前端之家收集整理的这篇文章主要介绍了检测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;
}@H_502_5@ 
 

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

internal compiler error: Segmentation fault
A0
^@H_502_5@ 
 

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

解决方法

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

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

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

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

猜你在找的C&C++相关文章