Pertanyaan gcc-4.9 Perilaku Tidak Terdefinisi Sanitizer


Di perubahan gcc-4.9 ia mengatakan:

UndefinedBehaviorSanitizer (ubsan), perilaku yang tidak terdefinisi cepat   detektor, telah ditambahkan dan dapat diaktifkan melalui -fsanitize = tidak terdefinisi.   Berbagai perhitungan akan diinstrumentasi untuk mendeteksi perilaku tidak terdefinisi   saat runtime. UndefinedBehaviorSanitizer saat ini tersedia untuk   Bahasa C dan C ++.

Saya melihat pertanyaan ini (Implementasi C ++ yang mendeteksi perilaku tidak terdefinisi?) tetapi tampaknya cukup usang.

Link ini (http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html) memiliki beberapa informasi tentang itu, tetapi sudah berusia beberapa bulan.

Ini adalah upaya untuk menambahkan Sanitizer Perilaku Tidak Terdefinisi ke GCC.   Perhatikan bahwa itu sangat versi alpha; sejauh ini tidak begitu banyak, di   saat itu harus menangani pembagian dengan nol kasus, INT_MIN / -1, dan   berbagai kasus shift (bergeser oleh nilai negatif, bergeser kapan   operan kedua adalah> = dari TYPE_PRECISION (first_operand) dan sejenisnya.   (Pada tipe integer, sejauh ini.)

Dari apa yang saya baca itu sedang diporting ke gcc dari LLVM.

Saya sudah mencobanya (5 / 0) dan satu-satunya perbedaan tampaknya menjadi output ini:

main.cpp:5:19: runtime error: division by zero

Apakah ada yang punya informasi lebih lanjut tentang itu atau fitur apa yang dimilikinya?


32
2017-12-23 06:38


asal


Jawaban:


Ini lebih merupakan kerangka kerja untuk menambahkan cek seperti itu daripada upaya untuk mendeteksi semua bentuk perilaku tidak terdefinisi (yang hampir pasti tidak mungkin dalam arti "terputus masalah").

Itu Dokumentasi GCC daftar ini sebagai cek yang didukung saat ini:

-fsanitize=undefined   Aktifkan UndefinedBehaviorSanitizer, detektor perilaku yang tidak terdefinisi cepat. Berbagai perhitungan akan diinstrumentasi   untuk mendeteksi perilaku tidak terdefinisi saat runtime. Suboptions saat ini adalah:

-fsanitize=shift Opsi ini memungkinkan memeriksa bahwa hasil dari operasi shift tidak terdefinisi. Perhatikan bahwa apa yang sebenarnya dipertimbangkan   tidak terdefinisi sedikit berbeda antara C dan C ++, serta antara ISO   C90 dan C99, dll.

-fsanitize=integer-divide-by-zero Mendeteksi pembagian bilangan bulat dengan nol serta INT_MIN / -1 divisi.

-fsanitize=unreachable Dengan opsi ini, kompiler akan mengubah panggilan __builtin_unreachable menjadi panggilan pesan diagnostik sebagai gantinya. Saat mencapai panggilan __builtin_unreachable, perilaku tersebut   tidak terdefinisi.

-fsanitize=vla-bound Opsi ini menginstruksikan compiler untuk memeriksa bahwa ukuran array panjang variabel adalah positif. Opsi ini tidak   memiliki efek apa pun dalam mode -std = c ++ 1y, karena standar membutuhkan   kecuali dilempar sebagai gantinya.

-fsanitize=null Opsi ini memungkinkan pemeriksaan pointer. Khususnya, aplikasi yang dibangun dengan opsi ini dihidupkan akan mengeluarkan kesalahan   pesan ketika mencoba untuk dereference penunjuk NULL, atau jika referensi   (Mungkin referensi rvalue) terikat ke pointer NULL.

-fsanitize=return Opsi ini memungkinkan pengecekan kembali pernyataan. Program yang dibangun dengan opsi ini dihidupkan akan mengeluarkan pesan kesalahan   ketika akhir dari fungsi non-kosong tercapai tanpa benar-benar   mengembalikan nilai. Opsi ini berfungsi hanya dalam C ++.

-fsanitize=signed-integer-overflowOpsi ini memungkinkan pemeriksaan overflow integer bertanda tangan. Kami memeriksa bahwa hasil +, *, dan keduanya unary   dan biner - tidak meluap dalam aritmatika yang ditandatangani. Catatan,   aturan promosi integer harus diperhitungkan. Itu adalah   berikut ini bukan overflow:

signed char a = SCHAR_MAX;
a++;

Sementara -ftrapv menyebabkan jebakan untuk overflows yang ditandatangani akan dipancarkan, -fsanitize=undefined memberikan pesan diagnostik. Ini   saat ini hanya berfungsi untuk keluarga bahasa C.


40
2017-12-23 07:13



Daftar lengkap opsi yang tercantum dalam UndefinedBehaviorSanitizer

Penggantian GCC 5.0 terbaru diambil dari Seri Rilis GCC 5: Perubahan, Fitur Baru, dan Perbaikan tercantum di bawah ini;

UndefinedBehaviorSanitizer memperoleh beberapa opsi sanitasi baru:

-fsanitize=float-divide-by-zero: detect floating-point division by zero;
-fsanitize=float-cast-overflow: check that the result of floating-point type to integer conversions do not overflow;
-fsanitize=bounds: enable instrumentation of array bounds and detect out-of-bounds accesses;
-fsanitize=alignment: enable alignment checking, detect various misaligned objects;
-fsanitize=object-size: enable object size checking, detect various out-of-bounds accesses.
-fsanitize=vptr: enable checking of C++ member function calls, member accesses and some conversions between pointers to base and derived classes, detect if the referenced object does not have the correct dynamic type.

1
2018-03-28 07:07