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,提问作者김성호
相关产品推荐
相关产品推荐

