逆波兰表达式求值代码触发运行时错误,请求排查修复
逆波兰表达式求值运行时错误排查
报错信息
Line 171: Char 16: runtime error: reference binding to misaligned address 0xbebebebebebec0ba for type 'int', which requires 4 byte alignment (stl_deque.h) 0xbebebebebebec0ba: note: pointer points here <memory cannot be printed> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_deque.h:180:16
问题代码
class Solution { public: int evalRPN(vector<string>& tokens) { int n {static_cast<int>(tokens.size())}, x {0}, y{0}; stack<int> st; for (int i =0; i<n; i++){ if ( (tokens[i][0] >= '0')&&(tokens[i][0] <= '9') ){ st.push(tokens[i][0] - '0'); }else{ y = st.top(); st.pop(); x = st.top(); st.pop(); switch(tokens[i][0]){ case '+': st.push(x+y); break; case '-': st.push(x-y); break; case '*': st.push(x*y); break; case '/': st.push(x/y); break; } } } return st.top(); } };
错误含义与代码问题分析
对齐错误的本质
报错里的“错误对齐地址访问”只是表象,实际原因是访问了空栈的top()。0xbebebebebebec0ba是内存填充标记,代表当前访问的是已释放或未初始化的无效内存。当栈为空时调用st.top(),返回的内存地址不符合int类型要求的4字节对齐规则,因此被UndefinedBehaviorSanitizer检测并报错。
代码的核心错误
- 数字判断逻辑漏洞:
代码仅通过字符串第一个字符是否为数字来判断是否是数值,但负数(如"-12")的第一个字符是'-',会被错误归类为运算符。此时栈中可能没有足够元素,调用st.top()就会触发空栈访问的未定义行为。 - 数字转换不完整:
即使是正数(如"123"),代码只取第一个字符转换为int(比如"123"会被转成1而非123),导致栈内存储的数值完全错误,后续计算逻辑混乱,最终也可能引发栈空访问。
为什么部分编译器能正常运行?
未定义行为的结果是不确定的:
- 部分在线编译器未启用UndefinedBehaviorSanitizer这类严格的内存检测工具,即使访问空栈也不会立刻报错;
- 若测试用例未包含负数或多位数,代码的错误不会被触发,看起来能正常运行。但LeetCode的测试用例覆盖了这些场景,且启用了严格检测,因此暴露了问题。
内容的提问来源于stack exchange,提问作者prasun
相关产品推荐
相关产品推荐

