You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC 4.9.2环境下该段C++代码触发SIGABRT的原因排查

Algospot LUNCHBOX 提交SIGABRT错误排查结论

核心错误原因

错误和vector::resize、scanf调用均无关,根源是std::sort传入的比较函数违反了C++标准要求的严格弱序规则,触发未定义行为,评测环境的STL实现检测到该违规后会主动调用abort()终止程序,返回SIGABRT信号。

具体错误细节

你实现的排序比较逻辑为:

[](pair<int, int> &i, pair<int, int> &j)
{ return i.second >= j.second; }

std::sort要求比较函数comp必须满足约束:若comp(a,b)返回true,则comp(b,a)必须返回false。当两个便当的用餐时间(即second字段)相等时,i.second >= j.second和j.second >= i.second会同时返回true,完全违反上述约束。
本地环境能正常运行是因为不同编译器/STL版本对sort的违规检查逻辑不同,部分环境不会主动校验该规则,看似运行正常实际属于未定义行为,存在逻辑隐患。

修复方案

将比较运算符从>=改为>即可满足严格弱序要求,优化后的代码建议给比较参数加上const修饰,避免不必要的拷贝:

sort(lunchbox.begin(), lunchbox.end(),
         [](const pair<int, int> &i, const pair<int, int> &j)
         { return i.second > j.second; });

其他逻辑排查结果

  • vector::resize操作无问题:lunchbox.resize(n, make_pair(0, 0))会将vector长度正确调整为n,后续循环读写范围均在vector合法长度内,不存在越界访问。
  • scanf调用无问题:所有传入scanf的参数均为对应int类型的变量地址,格式匹配符正确,不存在非法内存读写。

内容的提问来源于stack exchange,提问作者김성호

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:03:51