Nouvelles Du Monde

c++ – Accès à l’exception de pointeur déréférencé avec des classes imbriquées

c++ – Accès à l’exception de pointeur déréférencé avec des classes imbriquées

2024-05-13 08:09:00

L’exécuter via GCC avec -fsanitize=address donne :

=================================================== =============== == 1 == Erreur: AdresseSanitizer: Stack-use-after-return on Adresse 0x79BEA1C00060 AT PC 0x0000004012BE BP 0x7ffce7648020 SP 0x7ffce7648018 Lire de la taille 8 à 0x79bea1c00060 Thread T0 # 0 0x4012bd dans top::mid::low::addToVal() /app/example.cpp:11 #1 0x40120f dans main /app/example.cpp:31 #2 0x79bea3a29d8f (/lib/x86_64-linux-gnu/libc .so.6+0x29d8f) (BuildId : 962015aa9d133c6cbcfb31ec300596d7f44d3348) #3 0x79bea3a29e3f dans __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f) (BuildId 96 2015aa9d133c6cbcfb31ec300596d7f44d3348) #4 0x4010c4 dans _start (/app/output .s+0x4010c4) (BuildId : 52657344baa840d03bd8657b741b84c6bfb25e30) L’adresse 0x79bea1c00060 est située dans la pile du thread T0 au décalage 32 dans le cadre #0 0x401541 dans top::top() /app/example.cpp:25 Ce cadre contient 1 objet (s) :[3248)’
[3248)’‘ <== L'accès à la mémoire au décalage 32 se trouve à l'intérieur de cette variable. CONSEIL : cela peut être un faux positif si votre programme utilise un mécanisme de déroulement de pile personnalisé, swapcontext ou vfork (les exceptions longjmp et C++ *sont* prises en charge) RÉSUMÉ : AddressSanitizer : stack- utiliser-après-retour /app/example.cpp:11 dans top::mid::low::addToVal()

La raison du problème est que mid(this) est temporaire. Lorsqu’il est construit, il passe un pointeur vers lui-même dans low, et ce pointeur est requis pour accéder à l’instance supérieure via parent->parent.

Lire aussi  [SEED] 5 millions d'euros pour KOLET pour accéder à de la DATA via mobile dans 120 pays à petit prix.

Ainsi, après avoir copié mid(this).child dans top::child, la valeur mid temporaire est détruite, ce qui vous laisse avec un pointeur suspendu stocké dans child.parent. Toute tentative de child.addToVal() tente ensuite de déréférencer ce pointeur suspendu, ce qui entraîne un comportement indéfini.

Vous devriez repenser votre conception. Si low nécessite un pointeur vers le haut et que mid est généralement temporaire, stockez-le simplement directement au lieu de stocker mid :

classe faible { public : top* parent = nullptr ; void addToVal() { parent->val += 1; } low(mid* Parent) { parent = Parent->parent; } faible() {} };

Alternativement, proposez un design moins alambiqué !



#Accès #lexception #pointeur #déréférencé #avec #des #classes #imbriquées
1715592627

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

ADVERTISEMENT