`std::to_string(INFINITY)` 给出 `g++ -O3` 的段错误

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

使用 g++ 版本

gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~16.04)  
,当我编译此代码(如
g++ -O3 <file>
)并运行可执行文件时,应用程序会给出 seg 错误

#include <iostream>                                                                                                                                                                    
#include <cmath> 
#include <string>                                                                                                                                                                      
                                                                                                                                                                                       
void test() {                                                                                                                                                                          
  std::cout << "test: " << std::endl;                                                                                                                                                  
  std::cout << "init" << std::endl;                                                                                                                                                    
  std::cout << "inf" << std::endl;                                                                                                                                                     
  std::cout << std::to_string(INFINITY) << std::endl;                                                                                                                                  
  std::cout << "init done" << std::endl;                                                                                                                                               
}                                                                                                                                                                                      
                                                                                                                                                                                       
                                                                                                                                                                                       
int main ()                                                                                                                                                                            
{                                                                                                                                                                                      
  std::cout << "test: " << std::endl;                                                                                                                                                  
  std::cout << "init" << std::endl;                                                                                                                                                    
  std::cout << "inf" << std::endl;                                                                                                                                                     
  std::cout << std::to_string(INFINITY) << std::endl;                                                                                                                                  
  std::cout << "init done" << std::endl;                                                                                                                                               
  return 0;                                                                                                                                                                            
}                                                                                                                                                                                      
~         

seg 错误调用堆栈如下:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400f01 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > __gnu_cxx::__to_xstring<std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, char>(int (*)(char*, unsigned long, char const*, __va_list_tag*), unsigned long, char const*, ...) [clone .constprop.20] ()
(gdb) bt
#0  0x0000000000400f01 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > __gnu_cxx::__to_xstring<std::__cxx11::basic_string<char, std::char_traits<cha
r>, std::allocator<char> >, char>(int (*)(char*, unsigned long, char const*, __va_list_tag*), unsigned long, char const*, ...) [clone .constprop.20] ()
#1  0x0000000000400c63 in main ()

有趣的是,当我评论

test
函数时,它就不会发生..不确定是否是内存损坏的情况

其他事实

  • 如果我不使用,就不会发生这种情况
    -O3

现场演示

c++ string segmentation-fault g++ tostring
1个回答
0
投票

这是一个旧的 gcc bug,已在后续版本中修复。

[7 回归] 记录 std::to_string(NAN) 时出现 SEGFAULT

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