AddressSanitizer:未知地址 0x000000000000 上的 SEGV 是什么意思?

Ved*_*rad 7 c++ runtime-error address-sanitizer

我正在解决 leetcode 问题并收到此错误。我不知道这意味着什么,因为我对 C++ 还比较陌生。当我删除 else if 中的 else 时,它​​似乎消失了。

AddressSanitizer:DEADLYSIGNAL
=================================================================
==32==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000383e8c bp 0x7ffc55bebe50 sp 0x7ffc55bebd20 T0)
==32==The signal is caused by a READ memory access.
==32==Hint: address points to the zero page.
    #3 0x7f2222e3982f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
AddressSanitizer can not provide additional info.
==32==ABORTING
Run Code Online (Sandbox Code Playgroud)

我的代码:

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        int flag=1;
        for(int i=0; i< s.length();i++){
            if(s[i]=='('||s[i]=='{'||s[i]=='['){
                stk.push(s[i]);
                flag=0;
            }
            else { //if (s[i]==')'||s[i]=='}'||s[i]==']'){
                if(s[i]==')'&&stk.top()=='('){
                    stk.pop();
                    flag=1;
                }
                 else if(s[i]==']'&&stk.top()=='['){
                    stk.pop();
                    flag=1;
                }
                else if(s[i]=='}'&&stk.top()=='{'){
                    stk.pop();
                    flag=1;
                }
                else
                    return false;
            }
        }
        if(flag==0)
            return false;
        else
            return true;
    }
};
Run Code Online (Sandbox Code Playgroud)

ks1*_*322 8

这意味着您正在代码中的某个位置取消引用空指针。gdb 将是调试这个问题的更好工具。运行gdb program -ex r直到崩溃。然后打印 stacktrace 以bt查看出了什么问题。


bit*_*ask 3

这是由于空指针取消引用而导致的分段错误。

我的猜测是您正在查询空堆栈(双端队列)的顶部元素。如果容器从来都不是非空的,它可能保存一个空指针。

的文档std::deque<..>::back(即所谓的 by )std::stack<..>::top确认这表现出 UB:

返回对容器中最后一个元素的引用。

回调空容器会导致未定义的行为。