【问题标题】:Why does g++ generate huge error log?为什么g ++会生成巨大的错误日志?
【发布时间】:2019-01-02 05:25:03
【问题描述】:

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

【问题讨论】:

  • 您在询问一种语言的内部日志记录功能。即使您担心潜在的 DoS 影响,这也不是安全问题。
  • 可能最适合 gcc 开发邮件列表。
  • 日志的内容是什么样的?
  • 除非“受害者”是某种在线编译服务,否则很难看出这会如何构成攻击。大多数人不经常编译随机源代码。你在什么情况下会担心这个?
  • @rici 你明白了。确实是在线编译服务。

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


【解决方案1】:

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

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

当您递归地产生歧义时,错误消息会呈指数增长,因为编译器会通知您它可能意味着的一组事物。假设? 可以表示AB??? 可以是AAAAABABAABBBAABBA4, BBB.

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

【讨论】:

  • 公平地说,作为 QoI 问题,我希望 --fmax-error 的默认值更合理一些。我以为是。尽管如此,我还没有看到这样可以实现什么样的“受害者”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多