在某个地方,我看到了这个格式错误的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 ++在编译过程中发生了什么,使它吐出了这样的日志。
答案 0 :(得分:0)
我真的无法回答发生什么特别的事情,这样的错误是无数的,但是请记住,C ++可能是最复杂的语法对男人。
编译器的一部分工作是通知用户什么对特定输入有问题,即C ++无效(或者在出现警告的情况下,它是好的)。
当您递归地产生歧义时,错误消息将呈指数增长,因为编译器会告知您可能意味着的事情。假设?
可以表示A
或B
,???
可以是AAA
,AAB
,ABA
,{{1 }},ABB
,BAA
,BAB
或BBA
。
当您使用BBB
告诉您时,编译器只知道第100000000次近重复对您并不重要。