Что означает AddressSanitizer: SEGV по неизвестному адресу 0x000000000000? - PullRequest
0 голосов
/ 07 апреля 2020

Я решаю вопрос с кодом leetcode и получаю эту ошибку. Я понятия не имею, что это значит, поскольку я относительно новичок в C ++. Кажется, он исчезает, когда я удаляю else из else if.

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

Мой код:

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;
    }
};

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Это означает, что вы разыменовываете нулевой указатель где-то в вашем коде. GDB будет лучшим инструментом для устранения этой проблемы. Запускайте gdb program -ex r, пока не произойдет сбой. Затем напечатайте трассировку стека с помощью bt, чтобы увидеть, что происходит не так.

0 голосов
/ 07 апреля 2020

вам нужно обработать случай, когда входная строка начинается с любого символа, предназначенного для всплывающего сообщения, например, ')' или '(', потому что в этом случае вы извлекаете из stack уже пусто .

0 голосов
/ 07 апреля 2020

Это ошибка сегментации из-за разыменования нулевого указателя.

Я предполагаю, что вы запрашиваете верхний элемент пустого стека (deque). Если контейнер никогда не был не пустым, он может содержать нулевой указатель.

Документация для std::deque<..>::back, которая называется std::stack<..>::top подтверждает, что это показывает UB:

Возвращает ссылку на последний элемент в контейнере.

Обратный вызов пустого контейнера вызывает неопределенное поведение.

...