我使用的框架已经在 CentOS 7 上运行了多年。我们正在将其迁移到 RHEL 8,但一些单元测试失败了。其中一个特别涉及从 std::runtime_error 上的 What() 返回垃圾。我创建了一个非常简单的例子来重复这个问题。它可以在 CentOS7 上运行,但不能在 RHEL 8 上运行。代码如下:
#include <sstream>
#include <iostream>
const char * getString() {
std::ostringstream oss;
oss << "some stuff to return" << std::endl;
std::cout << "value to return: " << oss.str().c_str() << std::endl;
return oss.str().c_str();
}
int
main(int argc, char ** argv) {
std::string value = getString();
std::cout << "value returned: " << value << std::endl;
return 0;
}
CentOS7 的输出是:
[user@localhost ~]$ ./a.out
value to return: some stuff to return
value returned: some stuff to return
而 RHEL8 上的输出是:
[user@localhost badoverload]$ ./a.out
value to return: some stuff to return
value returned: `
该值是否超出范围且不可用,但在 CentOS 7 中内存恰好未受影响?还是有其他事情发生?
getString()
返回一个悬空指针。 std::string
返回的str()
被销毁,当
std::string value = getString();
从指针读取,未定义的行为是事实。
只需返回
std::string
而不是 const char*
。