Saya ingin mengaktifkan - secara harfiah - SEMUA peringatan yang dimiliki GCC. (Anda akan berpikir itu akan mudah ...)
Anda akan berpikir
-Wall
mungkin melakukan trik, tetapi tidak! Masih butuh-Wextra
.Anda akan berpikir
-Wextra
mungkin melakukan trik, tetapi tidak! Tidak semua peringatan yang tercantum di sini (misalnya,-Wshadow
) diaktifkan oleh ini. Dan saya masih tidak tahu apakah daftar ini komprehensif.
Bagaimana cara saya memberi tahu GCC untuk mengaktifkan (tidak ada jika, dan, atau tapi!) Semua peringatan yang dimilikinya?
c++
gcc
warnings
compiler-warnings
gcc-warning
pengguna541686
sumber
sumber
-Weverything
.Jawaban:
Kamu tidak bisa
Manual untuk GCC 4.4.0 hanya komprehensif untuk versi itu, tetapi ia mencantumkan semua peringatan yang mungkin untuk 4.4.0. Mereka tidak semua pada halaman yang Anda tautkan, misalnya beberapa opsi khusus bahasa ada pada halaman untuk opsi C ++ atau opsi Obj-C. Untuk menemukan semuanya, Anda lebih baik melihat Ringkasan Opsi
Menghidupkan semuanya akan termasuk
-Wdouble-promotion
yang hanya relevan pada CPU dengan unit floating-point 32-bit presisi tunggal yang mengimplementasikanfloat
dalam perangkat keras, tetapi mengemulasidouble
dalam perangkat lunak. Melakukan perhitungan sepertidouble
akan menggunakan emulasi perangkat lunak dan menjadi lebih lambat. Itu relevan untuk beberapa CPU tertanam, tetapi sama sekali tidak relevan untuk CPU desktop modern dengan dukungan perangkat keras untuk floating-point 64-bit.Peringatan lain yang biasanya tidak berguna adalah
-Wtraditional
, yang memperingatkan tentang kode yang dibentuk dengan sempurna yang memiliki arti berbeda (atau tidak berfungsi) dalam"string " "concatenation"
definisi fungsi C tradisional, misalnya , atau ISO C! Apakah Anda benar-benar peduli tentang kompatibilitas dengan kompiler berusia 30 tahun? Apakah Anda benar-benar menginginkan peringatan untuk menulisint inc(int i) { return i+1; }
?Saya pikir
-Weffc++
terlalu berisik untuk berguna, itu didasarkan pada edisi pertama Efektif C ++ yang sudah ketinggalan zaman dan memperingatkan tentang konstruksi yang benar-benar valid C ++ (dan untuk itu pedoman diubah dalam edisi buku selanjutnya.) Saya tidak ingin menjadi memperingatkan bahwa saya belum menginisialisasistd::string
anggota di konstruktor saya; ia memiliki konstruktor default yang melakukan persis apa yang saya inginkan, mengapa saya harus menulism_str()
untuk memanggilnya? The-Weffc++
peringatan yang akan membantu terlalu sulit bagi compiler untuk mendeteksi secara akurat (memberikan negatif palsu), dan orang-orang yang tidak berguna, seperti menginisialisasi semua anggota secara eksplisit, hanya menghasilkan terlalu banyak kebisingan, memberikan positif palsu.Luc Danton memberikan contoh yang bagus dari peringatan tidak berguna dari
-Waggregate-return
yang hampir pasti tidak pernah masuk akal untuk kode C ++.yaitu Anda tidak benar-benar menginginkan semua peringatan, Anda hanya berpikir Anda melakukannya.
Bacalah manual, baca tentang mereka, putuskan yang Anda mungkin ingin aktifkan, cobalah. Membaca manual kompiler Anda adalah Good Thing TM , mengambil jalan pintas dan mengaktifkan peringatan yang tidak Anda mengerti bukanlah ide yang sangat bagus, terutama jika itu untuk menghindari keharusan RTFM.
Siapa pun yang baru saja menyalakan segalanya mungkin melakukannya karena mereka tidak tahu apa-apa karena atau bos yang berambut runcing berkata "tidak ada peringatan."
Beberapa peringatan penting, dan beberapa tidak. Anda harus melakukan diskriminasi atau Anda mengacaukan program Anda. Pertimbangkan, misalnya
-Wdouble-promotion
,. Jika Anda bekerja pada sistem tertanam Anda mungkin menginginkan ini; jika Anda bekerja pada sistem desktop Anda mungkin tidak. Dan apakah kamu mau-Wtraditional
? Aku meragukan itu.Sunting: Lihat juga -Wall-all untuk mengaktifkan semua peringatan yang ditutup sebagai WONTFIX.
Sunting 2: sebagai tanggapan terhadap keluhan DevSolar tentang makefile yang perlu menggunakan peringatan berbeda tergantung pada versi kompiler, jika
-Wall -Wextra
tidak cocok maka tidak sulit untuk menggunakan CFLAGS khusus-kompiler dan khusus-versi:sumber
-Weverything
adalah solusi yang lebih baik, saya pikir, daripada strategi gcc untuk tidak memberikan opsi seperti itu. Saya menggunakan bendera itu dengan dentang karena filosofi saya adalah bahwa saya ingin semua peringatan diaktifkan secara default (karena seseorang berpikir itu cukup membantu untuk ditambahkan ke kompiler), dan jika saya tidak suka, saya mematikan peringatan itu secara khusus. Intinya adalah bahwa Anda tidak tahu tentang peringatan yang tidak memicu, tetapi Anda tahu tentang peringatan yang tidak Anda inginkan yang memicu, dan mereka mudah dimatikan.-Weverything
opsi Dentang , tetapi tidak mungkin dilakukan dengan GCC.Saya setuju dengan jawaban sebelumnya bahwa mungkin tidak bermanfaat untuk mengaktifkan semua peringatan, namun GCC memang menyediakan cara yang cukup mudah untuk mencapai hal ini. Perintah
memberikan daftar semua opsi peringatan yang didukung dengan informasi apakah mereka aktif. Dengan cara ini dapat digunakan untuk mengetahui opsi mana yang (tidak) diaktifkan oleh mis
-Wall
dan-Wextra
Untuk mengaktifkan semua peringatan, Anda dapat menggunakan beberapa regex untuk mengekstrak parameter baris perintah
Untuk GCC saya saat ini, ini memberikan:
Ini sekarang dapat digunakan untuk memanggil GCC, yaitu
Namun perlu dicatat bahwa ini menghasilkan peringatan karena beberapa opsi peringatan hanya tersedia untuk bahasa tertentu (mis
C++
.). Ini dapat dihindari dengan menggunakan beberapa regex lagi untuk hanya menyertakan opsi yang diizinkan untuk bahasa saat ini atau dengan menambahkan yang sesuai-Wno-whatever
di akhir panggilan.sumber
-isystem
alih-alih-I
untuk direktori yang relevan.Tidak mungkin memprogram dengan semua peringatan diaktifkan (kecuali Anda akan mengabaikannya, tetapi mengapa harus repot-repot?). Sebagai contoh, mari kita asumsikan Anda menggunakan set flag berikut:
-Wstrict-prototypes -Wtraditional
.Bahkan dengan dua peringatan diaktifkan, program berikut akan mengeluh.
Anda mungkin berpikir "baik, saya akan menggunakan prototipe gaya lama". Tidak, ini tidak akan berhasil.
Dan tidak, tidak menentukan prototipe juga salah, karena kompiler juga akan mengeluh.
Jika Anda mendefinisikan fungsi apa pun di dalam program Anda, Anda tidak dapat menggunakan semua flag, karena kompiler akan mengeluh tentang definisi fungsi yang bisa dibayangkan.
Untuk C ++, ini dimungkinkan (
-Wtraditional
flag tidak ada), dan program yang sangat sederhana dapat dikompilasi. Untuk mengaktifkan semua peringatan, gunakan daftar peringatan berikut (mungkin beberapa peringatan digandakan, karena saya tidak repot-repot memfilter peringatan yang diaktifkan oleh-Wall
).sumber
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
Seseorang telah menciptakan satu set alat untuk menentukan lengkap set peringatan untuk GCC diberikan atau versi dentang.
Untuk GCC, menyalin dari daftar lengkap peringatan yang disediakan oleh alat ini untuk versi kompiler Anda tampaknya menjadi satu - satunya cara untuk memastikan bahwa semua peringatan dihidupkan, karena (tidak seperti Dentang) GCC tidak menyediakan
-Weverything
.Alat ini tampaknya mem-parsing
c.opt
file aktual dalam kode sumber GCC, sehingga hasilnya harus definitif.Repositori juga berisi file teks dengan daftar peringatan yang dihasilkan untuk sebagian besar versi GCC dan Dentang (saat ini Dentang 3.2 hingga 3.7 dan GCC 3.4 hingga 5.3).
https://github.com/barro/compiler-warnings
sumber
Gcc 4.3+ sekarang memiliki -Q --help = peringatan, Anda bahkan dapat menentukan --help = peringatan, C untuk hanya mencetak peringatan terkait C.
Saya baru saja menulis modul m4 untuk mengambil keuntungan dari ini (juga mendukung clang's -Weverything), lihat wget_manywarnings.m4
Cara menggunakannya cukup sederhana, pada dasarnya modul mengaktifkan setiap tanda peringatan. Dan Anda menghapus peringatan sesuai kebutuhan - beberapa benar-benar sangat bertele-tele. Contoh: configure.ac
Jika Anda tidak menggunakan autotools, Anda akan menemukan kode untuk mengaktifkan semua peringatan yang dinonaktifkan di modul m4, yang pada dasarnya adalah panggilan gcc yang disalurkan melalui awk:
flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'
sumber
Dari halaman ini :
Saya kira pertanyaannya adalah yang mana ? Mungkin Anda bisa grep halaman yang untuk semua baris yang dimulai dengan -W, dan mendapatkan daftar lengkap bendera peringatan. Kemudian bandingkan dengan daftar di bawah
-Wall
dan-Wextra
. Ada juga-Wpedantic
, meskipun Anda jelas ingin menjadi lebih gagah lagi =)sumber
Mungkin memang demikian, tetapi satu-satunya daftar yang 100% komprehensif adalah sumber aktual untuk kompiler. Namun, GCC besar ! Dan saya tidak tahu apakah semua parameter baris perintah dikumpulkan di satu tempat atau tersebar di beberapa file sumber. Juga catat bahwa beberapa peringatan adalah untuk pra-prosesor, beberapa untuk kompiler aktual dan beberapa untuk penghubung (yang merupakan program yang sepenuhnya terpisah, dan ditemukan dalam paket binutils) sehingga kemungkinan besar tersebar.
sumber