1
votes

Que signifie AddressSanitizer: SEGV sur une adresse inconnue 0x000000000000?

Je résous une question de code leet et j'obtiens cette erreur. Je n'ai aucune idée de ce que cela signifie car je suis relativement nouveau en C ++. Il semble disparaître lorsque je supprime le else à l'intérieur du else if.

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

Mon code:

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


1 commentaires

Votre code a un comportement indéfini pour toute chaîne d'entrée qui commence par un crochet fermant, comme ")" .


4 Réponses :


1
votes

C'est une erreur de segmentation en raison d'un déréf d'un pointeur nul.

Je suppose que vous interrogez l'élément supérieur d'une pile vide (deque). Si le conteneur n'a jamais été non vide, il peut contenir un pointeur nul.

La documentation de std::deque<..>::back , qui est appelée par std::stack<..>::top confirme que cela présente UB:

Renvoie la référence au dernier élément du conteneur.

Le rappel d'un conteneur vide entraîne un comportement indéfini.


0 commentaires

1
votes

vous devez gérer le cas où la chaîne d'entrée commence par n'importe quel caractère destiné à être affiché, par exemple ')' ou '(', car dans ce cas, vous sortez et videz déjà la pile .


0 commentaires

3
votes

Cela signifie que vous déréférencer un pointeur nul quelque part dans votre code. gdb serait un meilleur outil pour déboguer ce problème. Exécutez le gdb program -ex r jusqu'à ce qu'il plante. Ensuite, imprimez stacktrace avec bt pour voir ce qui n'allait pas.


0 commentaires

1
votes

J'ai exécuté votre code pour le même problème sur leetcode et cette déclaration était défectueuse.

  if(s[i]==')'&&!stk.empty() &&stk.top()=='(')

l'erreur a été supprimée à l'aide d'une vérification des limites.

  if(s[i]==') &&stk.top()=='(')

De même pour deux autres instructions if. Maintenant, le code ne donne aucune erreur mais la logique est incorrecte quelque part. Il donne des résultats erronés pour "([]" testcase.


0 commentaires