我在某个地方看到这个格式错误的 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++可能具有人类已知的最复杂的语法。
编译器的部分工作是通知用户特定输入有什么问题,它不是有效的(或者在出现警告的情况下,是好的)C++。
当您递归地有歧义时,您可能会得到指数级增长的错误消息,因为编译器会通知您它“可能”意味着的一组内容。假设 ?
A
或 B
,
???
可以是
AAA
、
AAB
、
ABA
、
ABB
、
BAA
、
BAB
、
BBA
,或
BBB
。
当你用
--fmax-error
告诉编译器时,编译器才知道第 100000000 次接近重复对you 并不重要。