2016-05-23 12 views
0

Fangen habe ich den folgenden Code, der 45 Ausgänge:einen Hängender Zeiger

#include <iostream> 

int main() 
{ 
    int *p; 
    { 
     int n = 45; 
     p = &n; 
    } 
    std::cout << *p; 
} 

Da die Lebensdauer von n am Umfang endet ich diesen Code erwartet einen Fehler oder eine Warnung auszusenden. Mit GCC 6.1.0 und Clang 3.8.0 und dem libubsan-Desinfektionsmittel erhalte ich keinen Blip.

g++ -Wall -Wextra -pedantic -fsanitize=undefined 
clang++ -Weverything -fsanitize=undefined 

Valgrind beklagen sich auch nicht. Wenn ich bei der Montage aussehen, wieder verwendet GCC nur den gleichen Wert aus dem Stapel:

400789: 48 89 45 f8    mov QWORD PTR [rbp-0x8],rax 
     std::cout << *p; 
    40078d: 48 8b 45 f8    mov rax,QWORD PTR [rbp-0x8] 
    400791: 8b 00     mov eax,DWORD PTR [rax] 
    400793: 89 c6     mov esi,eax 
    400795: bf 60 10 60 00   mov edi,0x601060 
    40079a: e8 81 fe ff ff   call 400620 <std::basic_ostream<char, std::char_traits<char> >::operator<<(int)@plt> 
    } 
    std::cout << *p; 
    40079f: 48 8b 45 f8    mov rax,QWORD PTR [rbp-0x8] 
    4007a3: 8b 00     mov eax,DWORD PTR [rax] 
    4007a5: 89 c6     mov esi,eax 
    4007a7: bf 60 10 60 00   mov edi,0x601060 

Ich weiß es nicht definiertes Verhalten ist ein NULL-Zeiger, aber was ist mit einem baumelnden Zeiger auf Ehrerbietung? (Wenn es nicht definiertes Verhalten ist, bitte Zitate aus dem Standard bieten.)


ich für jemanden beweisen möchte, es ist nicht definiertes Verhalten, nicht nur sagen, dass es ohne Beweis. Die duplicate hat viele Antworten, die nicht zitierte Behauptungen machen. In C heißt es explizit, dass "das Verwenden eines Objekts außerhalb seiner Lebensdauer" ein undefiniertes Verhalten ist. In C++ ist dies nicht der Fall. Tatsächlich scheint § 3.8 nichts direktes zu sagen.

Bitte öffnen Sie meine Frage erneut, damit ich einen tatsächlichen Beweis und keine Frachtkultur erhalten kann.

+0

Schauen Sie sich das an. http://stackoverflow.com/questions/13888268/what-happens-when-a-variable-goes-out-of-scope Es ist fast genau die gleiche Frage. –

+0

Die Lebensdauer von Funktionsebenenvariablen ist die Funktionsaufrufdauer. Die Sichtbarkeit ist auf den erklärenden Bereich beschränkt, die Lebensdauer ist jedoch nicht begrenzt. –

+0

Fügen Sie Ihren Flaggen '-O' hinzu und Sie sollten eine Warnung erhalten. – user657267

Antwort

0

Dies ist auch undefiniertes Verhalten.

Ein C++ - Compiler ist nicht erforderlich, um eine Diagnose über jede mögliche Art von undefiniertem Verhalten zu ermitteln und auszustellen. Es ist sicherlich besser, wenn der Compiler so viel wie möglich abfängt, und im Laufe der Zeit sind die Compiler immer besser darin geworden, immer mehr Sachen zu pfeifen, die den Geruchstest nicht bestehen.

Aber natürlich, nur weil der C++ Compiler nicht meckert, bedeutet das nicht, dass der Code richtig ist.

+0

Ich suche nach Referenzen zu sichern, dass es "undefined Verhalten" ist, nicht nur Frachtkult und süße Analogien. Im Gegensatz zu C hat C++ kein praktisches Zitat, das direkt sagt "das ist undefiniert". Nach allem, was wir wissen, ist der Code klar definiert. – user6369079

+0

Ich bin mir ziemlich sicher, dass irgendwo im C++ - Standard angegeben ist, dass der Dereferenzierung eines Zeigers auf ein Objekt, das den Gültigkeitsbereich überschritten hat und dessen Destruktor aufgerufen wurde, undefiniertes Verhalten ist. Das ist grundlegend. –