为什么g ++会生成巨大的错误日志?

时间:2019-01-02 05:25:04

标签: c++ compiler-construction g++

在某个地方,我看到了这个格式错误的C ++程序可能会使g ++生成巨大的错误日志:

int main()
{
    struct x struct z<x(x(x(x(x(x(x(y,x(y><y*,x(y*w>v<y*,w,x{};
    return 0;
}

通过多次重复(x,错误日志可以增长到> 1GB。因此,该程序可用于耗尽受害者的系统资源。尽管可以通过--fmax-error来解决此问题,但我很好奇g ++在编译过程中发生了什么,使它吐出了这样的日志。

1 个答案:

答案 0 :(得分:0)

我真的无法回答发生什么特别的事情,这样的错误是无数的,但是请记住,C ++可能是最复杂的语法对男人。

编译器的一部分工作是通知用户什么对特定输入有问题,即C ++无效(或者在出现警告的情况下,它是好的)。

当您递归地产生歧义时,错误消息将呈指数增长,因为编译器会告知您可能意味着的事情。假设?可以表示AB???可以是AAAAABABA,{{1 }},ABBBAABABBBA

当您使用BBB告诉您时,编译器只知道第100000000次近重复对并不重要。