Apa kode C ++ terpendek yang terbentuk dengan baik yang menunjukkan perilaku tidak terdefinisi?
Apa kode C ++ terpendek yang terbentuk dengan baik yang menunjukkan perilaku tidak terdefinisi?
Jawaban:
int main(){main;}
3.6.1 Fungsi utama [basic.start.main]
3 - [...] Fungsi utama tidak boleh digunakan dalam suatu program.
Sunting: ini bisa didiagnosis, jadi bukan UB.
int main(){for(;;);}
1.10 Eksekusi multi-utas dan data balapan [intro.multithread]
24 - Implementasi dapat mengasumsikan bahwa utas pada akhirnya akan melakukan salah satu dari yang berikut: - mengakhiri, - melakukan panggilan ke fungsi I / O perpustakaan, - mengakses atau memodifikasi objek yang mudah menguap, atau - melakukan operasi sinkronisasi atau operasi atom .
int main(){int i=i;}
4.1 Konversi nilai-ke-nilai [conv.lval]
1 - [...] Jika objek yang direferensikan oleh glvalue adalah [...] tidak diinisialisasi, sebuah program yang mengharuskan konversi ini memiliki perilaku yang tidak ditentukan.
//^L.
Berikut ^L
ini adalah karakter umpan formulir, yang merupakan bagian dari rangkaian karakter dasar. 4 karakter (baris baru tidak diperlukan per 2.2: 2). Perilaku tidak terdefinisi adalah per
2.8 Komentar [lex.comment]
1 - Jika ada umpan formulir atau karakter tab vertikal dalam
//
komentar [a- style], hanya karakter spasi putih yang akan muncul di antara itu dan baris baru yang mengakhiri komentar; tidak diperlukan diagnostik.
\u\
0000
Ini memiliki delapan karakter, dan memiliki perilaku yang tidak terdefinisi, menurut §2.2 / 1.
Setiap instance karakter backslash (
\
) segera diikuti oleh karakter baris baru dihapus, menyambungkan baris sumber fisik untuk membentuk garis sumber logis. Hanya backslash terakhir pada baris sumber fisik mana saja yang memenuhi syarat untuk menjadi bagian dari sambungan tersebut. Jika, sebagai akibatnya, urutan karakter yang cocok dengan sintaks nama karakter-universal diproduksi, perilaku tidak terdefinisi.
main
.
main
. Sulit untuk menegakkan aturan ketika Anda meminta sebuah program yang tidak memiliki aturan untuk diikuti (itulah yang dimaksud UB!).
main
, apa yang Anda miliki adalah bentukan.
#include. /*Imagine a new-line right after the dot*/
§16.2 / 4:
Arahan preprocessing dari formulir
#include
pp-token baris baru(yang tidak cocok dengan salah satu dari dua formulir sebelumnya) diizinkan. [..] Jika arahan yang dihasilkan setelah semua penggantian tidak cocok dengan salah satu dari dua formulir sebelumnya, perilaku tidak terdefinisi.
int main(){int i=1>>-1;}
Penjelasan:
C ++ 98 dan C ++ 11 §5.8 / 1 keduanya menyatakan itu
Perilaku tidak terdefinisi jika operan kanan negatif, atau lebih besar dari atau sama dengan panjang dalam bit dari operan kiri yang dipromosikan.
int
biasanya 32? mengubah RHS dari pergeseran ke -1
adalah jumlah karakter yang sama dan tidak akan bergantung pada ukuran bilangan bulat
Jika seseorang mempercayai wikipedia, berikut adalah beberapa:
Mengubah string dikatakan menyebabkan perilaku yang tidak terdefinisi. Itu selalu berhasil untuk saya.
int main(int c,char*v){v[0]='.';}
Fungsi yang tidak batal tanpa pengembalian menyebabkan nilai pengembalian yang tidak ditentukan.
int a(){}
int main(){return a();}
Pembagian (int?) Dengan nol seharusnya tidak ditentukan. Yang saya tahu adalah crash.
int main(int c){c/0;}
int main(){}
paling tidak.
char **
tidak char *
. Anda hanya memodifikasi bagian dari nilai pointer. Bahkan, argv
dijamin aman dimodifikasi.
char *argv[]
tidak memiliki const
kualifikasi. Anda dapat menabrak dengan menulis ke string literal denganint main(){char *v="";*v=1;}