Was ist der kürzeste, wohlgeformte C ++ - Code, der undefiniertes Verhalten aufweist?
Was ist der kürzeste, wohlgeformte C ++ - Code, der undefiniertes Verhalten aufweist?
Antworten:
int main(){main;}
3.6.1 Hauptfunktion [basic.start.main]
3 - [...] Die Funktion main darf nicht innerhalb eines Programms verwendet werden.
Bearbeiten: Dies ist diagnostizierbar, also nicht UB.
int main(){for(;;);}
1.10 Multithread-Ausführungen und Datenrennen [intro.multithread]
24 - Die Implementierung kann davon ausgehen, dass ein Thread möglicherweise eine der folgenden Aktionen ausführt: - Beenden, - Aufrufen einer Bibliotheks-E / A-Funktion, - Zugreifen auf oder Ändern eines flüchtigen Objekts oder - Ausführen einer Synchronisationsoperation oder einer atomaren Operation .
int main(){int i=i;}
4.1 L-Wert-zu-Wert-Konvertierung [conv.lval]
1 - [...] Wenn das Objekt, auf das sich der Gl-Wert bezieht, [...] nicht initialisiert ist, hat ein Programm, das diese Konvertierung erfordert, ein nicht definiertes Verhalten.
//^L.
Hier ^L
ist das Formular-Feed-Zeichen, das Teil des Basiszeichensatzes ist. 4 Zeichen (pro 2.2: 2 ist kein Zeilenumbruch erforderlich). Undefiniertes Verhalten ist per
2.8 Kommentare [lex.comment]
1 - Wenn in einem
//
Kommentar im [a- Stil] ein Formular-Feed oder ein vertikales Tabulatorzeichen enthalten ist , dürfen nur Leerzeichen zwischen dem Kommentar und der neuen Zeile angezeigt werden, die den Kommentar beendet. Es ist keine Diagnose erforderlich.
\u\
0000
Dies hat acht Zeichen und ein undefiniertes Verhalten gemäß §2.2 / 1.
Jede Instanz eines Backslash-Zeichens (
\
), unmittelbar gefolgt von einem neuen Zeilenzeichen, wird gelöscht, wodurch physische Quellzeilen zu logischen Quellzeilen gespleißt werden. Nur der letzte Backslash auf einer physischen Quellleitung kann Teil eines solchen Spleißes sein. Wenn als Ergebnis eine Zeichenfolge erzeugt wird, die der Syntax eines universellen Zeichennamens entspricht, ist das Verhalten undefiniert.
main
.
main
. Es ist schwierig, Regeln durchzusetzen, wenn Sie nach einem Programm fragen, dem keine Regeln folgen müssen (das bedeutet UB!).
main
, was du hast, schlecht geformt.
#include. /*Imagine a new-line right after the dot*/
§ 16.2 / 4:
Eine Vorverarbeitungsanweisung des Formulars
#include
pp-tokens new-line(das nicht mit einem der beiden vorherigen Formulare übereinstimmt) ist zulässig. [..] Wenn die nach allen Ersetzungen resultierende Direktive nicht mit einer der beiden vorherigen Formen übereinstimmt, ist das Verhalten undefiniert.
int main(){int i=1>>-1;}
Erläuterung:
C ++ 98 und C ++ 11 §5.8 / 1 geben beide an, dass
Das Verhalten ist undefiniert, wenn der rechte Operand negativ ist oder größer oder gleich der Länge in Bits des heraufgestuften linken Operanden ist.
int
typisch 32? Das Ändern der RHS der Verschiebung auf -1
ist die gleiche Anzahl von Zeichen und hängt nicht von ganzzahligen Größen ab
Wenn man Wikipedia glauben will, hier ein paar:
Das Ändern von Zeichenfolgen soll undefiniertes Verhalten verursachen. Es hat immer für mich funktioniert.
int main(int c,char*v){v[0]='.';}
Eine nicht ungültige Funktion ohne Rückgabe verursacht undefinierte Rückgabewerte.
int a(){}
int main(){return a();}
Die Division (von int?) Durch Null ist angeblich undefiniert. Ich weiß nur, dass es abstürzt.
int main(int c){c/0;}
int main(){}
.
char **
nicht sein char *
. Sie ändern lediglich einen Teil eines Zeigerwerts. In der Tat argv
ist garantiert sicher modifizierbar.
char *argv[]
, keine const
Qualifikanten zu haben. Sie könnten abstürzen, indem Sie mitint main(){char *v="";*v=1;}