在协程 promise 聚合初始化期间抛出异常时出现 SIGSEGV (Clang 21 / nlohmann::json)
作者: DreamDonghao创建于 2026年9月2日更新于 2026年9月3日
** 描述错误**
adrogon:任务<TQQ Coroutine,在转换时使用**SIGSEGV在呼叫站点** 与T ' 发生碰撞的参数隐含可转换性。 过程在 [Unwind Resume] 内消亡,同时从部分构造的皮层框架取出;
例外是永远无法被抓住的。
最常见的现实世界触发器是nlohmann::json':其隐含的操作者价值Type()'称Get <ValueType'()',它为不匹配类型投出nlohmann:detail:type error.302'. 我们首先在生产过程中遇到这种情况:一个机器人过程在使用一个皮管工具处理器之后就悄悄地终止了。
参数是一个 JSON 对象(任务<std::string> takeing const json&')。 没有任何记录——这一进程已完全消失。
** 循环原因**
drogon::任务<T>:承诺-类型'(lib/inc/drogon/utils/coroutine.h')是一个聚合物——没有用户申报的构造器,其**第一个数据成员是`std:optional值>。- Clang 21从皮质论证中归纳出承诺,从立场上说:第一种论证是 " 价值 " 初始化的,因此,任何隐含的转换为 " T " 是在承诺建设期间 -- -- 在身体之前和 " 初始暂停 " 之前进行的。
- 如果转换投出,则取出`Unwind Resume'中部分构造的皮质框架断层。
崩溃报告摘录于以下最小重制程序:
页:1 例外类型:EXC BAD ACESS(SIGSEGV) 0 libunwind.dylib Unwind Resume +228 双向移动 1 repro min by Ref( Failconvert const &) +1060 <- coroutine 斜坡 (promise init); 尸体从未输入 2 repro min 主 + 136
** 废除**
环境:macOS 26.5.2 (arm64), Apple crang 21.0.0 (clang-2100.1.1.101), drogon 1.9.13 (Homebrew). C++20就足够了;不需要第三方库——再Pro使用5行站式.
翻译:
// repro.cpp (英语).
#包括 <drogon/utils/coroutine.h>
# 包括 "cstdio"
# 包含 < sdd >
包含 < 字符串 >
nlohmann:json:隐性可转换为 std:::string,
/和转换在运行时抛出.
结构失败
{
运算符 std:: string () const
{
printf ("转换参数 - > std: string (project init!)\n");
std::fflush(出局);
扔出 std: runtime error (“ 转换失败 ” );
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
* ;
drogon:: 任务<std:: string> 由Ref(const FaultConvert v)编写
{
co return "ok"; // 从未在 Clang 21 上到达
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
drogon:: 任务<std:: string> by Ptr (const FaultConvert *v) 互联网档案馆的存檔,存档日期2013-12-20.
{
co return "ok" ; (中文(简体) ).
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
内主( in argc, char **argv)
{
败诉 v;
尝试
{
如果(argc > 1)则
{
自动 t = byPtr( & v); //指针:没有转换,承诺默认构造
printf ("指针参数:ok\n");
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
其他情况
{
auto t = by Ref(v); // 参考文献: Clang 21 Control-inits promise.value from it.
. . . . . . .内容来源: drogonframework/drogon