代码之家  ›  专栏  ›  技术社区  ›  erenon

如果设置了delim MSB,则std::basic_istream::ignore挂起

  •  1
  • erenon  · 技术社区  · 4 年前

    给出以下代码片段:

    #include <iostream>
    #include <sstream>
    
    int main()
    {
      std::stringstream str;
      str.put('a');
      str.put('\x80');
      str.put('a');
    
      str.ignore(32, '\x80'); // hangs
      std::cout << str.tellg() << "\n";
    }
    

    如果使用gcc编译,则标记的行挂起,汇编步骤至指示无限循环。我在不同的操作系统上尝试了GCC 5.4、6.3、8.2、9.2,结果是一样的。 在wandbox上,也尝试了clang(可能是libc++而不是libstdc++附带的),它可以很好地终止。

    只有当ignore的第二个参数是设置了MSB的字符,并且流中前后至少有一个字符时,才会发生这种情况。这是libstdc++中的错误,还是标准禁止使用非ascii分隔符?

    0 回复  |  直到 4 年前