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

问题描述 投票:0回答:1

我在某个地方看到这个格式错误的 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++ 在编译过程中发生了什么,导致它吐出这样的日志。

c++ g++
1个回答
0
投票

我无法真正回答发生了哪些特定的事情,因此错误数不胜数,但请记住,C++可能具有人类已知的最复杂的语法。

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

当您递归地有歧义时,您可能会得到指数级增长的错误消息,因为编译器会通知您它“可能”意味着的一组内容。假设 ?

可以表示

AB

???
 可以是 
AAA
AAB
ABA
ABB
BAA
BAB
BBA
,或
BBB
当你用 
--fmax-error
 告诉编译器时,编译器才知道第 100000000 次接近重复对 
you

并不重要。

© www.soinside.com 2019 - 2024. All rights reserved.