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)’ 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. 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é !
[3248)’
#Accès #lexception #pointeur #déréférencé #avec #des #classes #imbriquées
1715592627