未定義の動作を示す、最も短くて整形式のC ++コードは何ですか?
未定義の動作を示す、最も短くて整形式のC ++コードは何ですか?
回答:
int main(){main;}
3.6.1メイン関数[basic.start.main]
3-[...]関数mainはプログラム内で使用しないでください。
編集:これは診断可能であるため、UBではありません。
int main(){for(;;);}
1.10マルチスレッド実行とデータ競合[intro.multithread]
24-実装は、任意のスレッドが最終的に次のいずれかを実行すると想定する場合があります。—終了、—ライブラリI / O関数の呼び出し、—揮発性オブジェクトへのアクセスまたは変更、または—同期操作またはアトミック操作の実行。
int main(){int i=i;}
4.1左辺値から右辺値への変換[conv.lval]
1-[...] glvalueが参照するオブジェクトが[...]初期化されていない場合、この変換を必要とするプログラムは未定義の動作をします。
//^L.
以下^L
は、基本的な文字セットの一部であるフォームフィード文字です。4文字(2.2:2ごとに改行は不要)。未定義の動作は
2.8コメント[lex.comment]
1-[a-
//
style]コメントにフォームフィードまたは垂直タブ文字がある場合、コメントとコメントを終了する改行の間には空白文字のみが表示されます。診断は必要ありません。
\u\
0000
§2.2/ 1によると、これは8文字で、動作は未定義です。
バックスラッシュ文字(
\
)の直後に改行文字が続く各インスタンスは削除され、物理ソース行を結合して論理ソース行を形成します。物理的なソース行の最後のバックスラッシュのみが、そのようなスプライスの一部になる資格があります。その結果、universal-character-nameの構文と一致する文字シーケンスが生成された場合の動作は未定義です。
main
ます。
main
。従うべきルールのないプログラムを要求するときにルールを適用することは困難です(それがUBの意味です!)。
main
、あなたが持っているものは不正な形式です。
#include. /*Imagine a new-line right after the dot*/
§16.2/ 4:
次の形式の前処理ディレクティブ
#include
pp-tokens改行(前の2つの形式のいずれとも一致しない)は許可されます。[..]すべての置換の後に生成されるディレクティブが前の2つの形式のいずれとも一致しない場合、動作は未定義です。
ウィキペディアを信じるなら、ここにいくつかあります:
文字列を変更すると、未定義の動作が発生すると言われています。それはいつも私のために働いています。
int main(int c,char*v){v[0]='.';}
戻り値のない非void関数は、未定義の戻り値を引き起こします。
int a(){}
int main(){return a();}
ゼロによる(int?の)除算はおそらく未定義です。私が知っているすべてはそれがクラッシュすることです。
int main(int c){c/0;}
int main(){}
最低でもとして定義する必要があります。
char **
ないでくださいchar *
。ポインタ値の一部を変更するだけです。実際、argv
安全に変更できることが保証されています。
char *argv[]
がないのは正しいことconst
です。文字列リテラルに書き込むとクラッシュする可能性がありますint main(){char *v="";*v=1;}