调试监视未初始化boost::optional致程序崩溃:责任归属?
调试空boost::optional触发程序崩溃问题
复现步骤
- 编写包含空
boost::optional(例如变量b)的程序,用以下命令编译:g++ -std=c++17 -O0 -g ... - 在程序任意位置设置断点
- 通过
vscode-cpptools调试适配器启动调试,等待程序命中断点 - 对
*b添加监视
崩溃报错信息
debugging: /usr/include/boost/optional/optional.hpp:1271: boost::optional<T>::reference_type boost::optional<T>::get() [with T = int; reference_type = int&]: Assertion `this->is_initialized()' failed.
疑问
程序本身并未触发未定义行为(UB),仅调试时添加监视的操作就导致崩溃,为何会出现这种情况?问题的责任方是谁?
临时解决方案与推测
切换为std::optional或改用CodeLLDB调试适配器可解决该问题,推测问题可能出在boost::optional、vscode-cpptools,甚至两者均存在问题。另外,使用命令行gdb调试也可复现该问题。
示例程序
#include <boost/none.hpp> #include <boost/optional/optional.hpp> #include <optional> #include <iostream> int main() { auto s = std::optional<int>{}; auto b = boost::optional<int>{}; if (s) { std::cout << *s << std::endl; } if (b) { std::cout << *b << std::endl; } std::cout << "done" << std::endl; }
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

