Bagaimana cara menghidupkan (secara harfiah) SEMUA peringatan GCC?

194

Saya ingin mengaktifkan - secara harfiah - SEMUA peringatan yang dimiliki GCC. (Anda akan berpikir itu akan mudah ...)

  • Anda akan berpikir -Wallmungkin melakukan trik, tetapi tidak! Masih butuh -Wextra.

  • Anda akan berpikir -Wextramungkin 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?

pengguna541686
sumber
27
@Arafangion: Saya tidak mengerti apa yang "tidak jelas" tentang pertanyaan - ya, saya ingin mengaktifkan semua peringatan yang berlaku untuk kode saya, tidak peduli seberapa hebatnya. Adapun alasannya, sangat sederhana: Saya telah menemukan beberapa peringatan yang tidak dinyalakan oleh -Wall atau -Wextra untuk membantu, jadi saya ingin mencoba sisanya untuk melihat apakah saya dapat memperbaiki kode saya. Sesederhana itu.
user541686
12
@ JoachimPileborg: "Apa yang Anda inginkan untuk diperingatkan oleh kompiler?" Potensi kesalahan dan / atau gaya buruk? Maksudku, jika aku tahu semua peringatan yang tepat maka aku akan menyalakannya secara manual, tidak perlu mengajukan pertanyaan. Jika jawabannya memang "Anda harus melihat kode sumber untuk menemukan semuanya" maka silakan posting sebagai jawabannya!
user541686
56
dentang 3.1 penawaran -Weverything.
Alexandre Hamez
5
@Rafangion Nah, pertanyaannya ditandai C ++ jadi ... :)
Beberapa programmer Bung
5
@ JoachimPileborg Dan sekarang ada (akhirnya) cara otomatis untuk mengekstrak peringatan dari sumber: github.com/barro/compiler-warnings
Kyle Strand

Jawaban:

129

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-promotionyang hanya relevan pada CPU dengan unit floating-point 32-bit presisi tunggal yang mengimplementasikan floatdalam perangkat keras, tetapi mengemulasi doubledalam perangkat lunak. Melakukan perhitungan seperti doubleakan 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 menulis int 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 menginisialisasi std::stringanggota di konstruktor saya; ia memiliki konstruktor default yang melakukan persis apa yang saya inginkan, mengapa saya harus menulis m_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-returnyang 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 -Wextratidak cocok maka tidak sulit untuk menggunakan CFLAGS khusus-kompiler dan khusus-versi:

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))
Jonathan Wakely
sumber
38
"Bacalah manualnya, bacalah tentang mereka, putuskan mana yang mungkin ingin kamu aktifkan, cobalah." Masalahnya di sini adalah langkah-langkah yang ditinggalkan: "Re-mengunjungi manual untuk setiap versi compiler dan menyesuaikan daftar peringatan karena mereka adalah berubah Membuat Makefiles Anda memeriksa versi compiler yang tepat dan menggunakan. Berbagai daftar peringatan untuk masing-masing. " Kami memiliki tingkat optimisasi yang dipertahankan oleh pengelola; mengapa mereka tidak bisa diganggu dengan memberikan layanan yang sama untuk peringatan?
DevSolar
17
@ JonathanWakely: Saya punya proyek saya , dan GCC tidak ada di antara mereka. Saya menunjukkan kelemahan pada produk mereka. Entah mereka memperbaikinya atau mereka menerima kesalahan karena tidak melakukannya, tetapi tidak terserah saya untuk memperbaikinya untuk mereka, OSS terkutuk.
DevSolar
14
@JonathanWakely: "Jika Anda menginginkan sesuatu, mintalah, jangan menggerutu tentang hal itu." - Saya tidak berkewajiban untuk berpartisipasi dalam proyek GCC untuk mengkritiknya, terutama tidak jika # 31573 telah ditandai sebagai WONTFIX. Yang menempatkan subjek ini dari "tanyakan tentang hal itu" ke dalam stadion "jalang tentang hal itu".
DevSolar
61
-Weverythingadalah 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.
David Stone
17
@ JonathanWakely Ya, tapi mereka remeh. Cara termudah untuk melihat peringatan apa yang mungkin relevan dengan kode Anda adalah untuk melihat peringatan mana yang dipicu oleh kode Anda; pada saat itu Anda dapat melihat contoh yang relevan dan nyata dari kode yang berpotensi berbahaya sebelum memutuskan untuk menonaktifkan atau tidaknya peringatan. Ini dapat dengan mudah dilakukan dengan -Weverythingopsi Dentang , tetapi tidak mungkin dilakukan dengan GCC.
Kyle Strand
71

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

gcc -Q --help=warning

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 -Walldan-Wextra

gcc -Wall -Wextra -Q --help=warning

Untuk mengaktifkan semua peringatan, Anda dapat menggunakan beberapa regex untuk mengekstrak parameter baris perintah

gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n'

Untuk GCC saya saat ini, ini memberikan:

-Wabi -Wabi-tag -Waddress -Waggregate-return -Waggressive-loop-optimisasi -Waliasing -Walign-commons -Wampersand -Warray-bounds -Warray-temporaries -Wassign-intercept -Wattributes -Wattributes -Watt-function-cast -Wbool-compare -Wbuiltin-macro-redefined -Wc ++ - compat -Wc ++ 0x-compat -Wc ++ 14-compat -Wc-binding-type -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -Wcast-qual -Wchar-subskrip -Wcharacter-truncation -Wchkp -Wclobbered -Wcomment -Wcompare-real -Didukung -Wcversion-extra -Wconversion-null -Wcoverage-mismatch -Wcpp -Wctor-dtor-privacyWdateWdate -setelah-pernyataan -Wdelete-tidak lengkap -Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-declarations -Wdesignated-init -Wdisabled-optimalisasi -Wdiscarded-array-kualifier -Wdiscarded-qualifiers -Wdiv-oleh-nol-promosi ganda -Weffc ++ -Wempty-body-Wendif-label -Wenum-bandingkan -Wextra -Wfloat-sama -Wformat-mengandung-nul -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-signness -Wformat-y2k -Wformat-zero-length -Wfree -nonheap-objek -Wfungsi-eliminasi -Wignored-kualifikasi -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wimplicit-interface -Wimplicit-procedure -Wincompatible-pointer-type -Winherited-variadic-ctor -Winit-self -Winline -Wint-conversion -Wint-to-pointer-cast -Wintrinsic-shadow -Wintrinsics-std -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wjump-misses-init -Wline-truncation -Wffiter-suffix -Wlogical -tidak-kurung -Wlogical-op -Panjang-panjang -Wain -Wmaybe-tidak diinisialisasi -Wmemset-ditransformasikan-args -Wissing-kawat gigi -Wissing-deklarasi -Wissing-bidang-inisialisasi -Wissing-termasuk-dir-parameter-tipe-mengetik -Menghapus-prototipe-Wmultichar -Wnarrowing -Wnested-externs -Wnoexcept -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-declaration -Wold-style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength-string -Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpedantic -Wpmf-konversi -Wpointer-arith -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wproperty -menetapkan-default -Wprotocol -Wreal-q-konstan -Wrealloc-lhs -Wrealloc-lhs-all -Wredundant-decls -Wreorder -Wreturn-local-addr -Wreturn-type -Wselector -Welcomeence-point -Wshadow -Wshadow-ivar -Wshift-count-negative -Wshift-count-overflow -Wsign-bandingkan -Wsign-promo -Wsized-deallocation -Wsizeof-array-argumen -Wsize-pointer-memaccess -Wstack-protector -Wstrict-null-sentinel -Wstrict-prototypes -Lain-ketat-pertandingan-Wsuggest-atribut = const -Wsuggest-atribut = format -Wsuggest-atribut = noreturn -Wsuggest-atribut = murni -Sarankan-metode-akhir -Sarankan-jenis-akhir -Sarankan-menimpa -Wsurprising -Wsurprising -Wswitch -Wswitch-bool -Wswitch -default -Wswitch-enum -Wsync-nand -Wsynth -Wsystem-header -Wtabs -Wtarget-Seumur Hidup -Wtraditional-Konversi -Wtrampolines -Wtrigraphs -Wtype-limit -Wundeclared-selector -Wundef -Wunflow prun -Wunsafe-loop-optimisasi -Wunsuffixed-float-konstanta -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-dummy-argumen -Wunused-function -Wunused-label -Wunused-local-typedefs -Digunakan-macro -Digunakan-parameter -Digunakan-hasil -Digunakan-nilai -Digunakan-variabel -Digunakan-saja -Gunakan-cor -Wvarargs -Wvariadic-makro -Wvektor-operasi-kinerja -Wvirtual-move-assign-Wvla -Wavatile-register-var -Wwrite-string -Wzero-as-null-pointer-konstan -Wzerotrip -frequire-return-statement

Ini sekarang dapat digunakan untuk memanggil GCC, yaitu

gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')

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-whateverdi akhir panggilan.

Haatschii
sumber
10
Saya khawatir ini tidak praktis. Gcc telah menunjukkan saya peringatan dari std lib.
Valentin Heinitz
13
@ValentinHeinitz Seperti yang saya katakan saya pikir tidak bermanfaat untuk mengaktifkan semua peringatan, tapi inilah yang diminta OP. Namun saya pikir dengan secara eksplisit menghapus beberapa peringatan bermasalah yang telah disebutkan dalam jawaban lain (misalnya dengan menambahkan masing-masing-Tidak-apa pun di akhir panggilan), ini dapat digunakan secara praktis.
Haatschii
6
@ValentinHeinitz Anda dapat mencegah gcc mengeluarkan peringatan untuk header sistem / std / 3rd party dengan menggunakan -isystemalih-alih -Iuntuk direktori yang relevan.
Kyle Strand
4
Ini harus menjadi jawaban yang diterima karena ini sebenarnya dan langsung menjawab pertanyaan.
TFuto
16

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.

/tmp $ cat main.c 
int main(int argc, char **argv) {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c: In function main’:
main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]
 int main(int argc, char **argv) {
     ^

Anda mungkin berpikir "baik, saya akan menggunakan prototipe gaya lama". Tidak, ini tidak akan berhasil.

/tmp $ cat main.c 
int main(argc, argv)
    int argc;
    char **argv;
{
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

Dan tidak, tidak menentukan prototipe juga salah, karena kompiler juga akan mengeluh.

/tmp $ cat main.c 
int main() {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main() {
     ^

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 ( -Wtraditionalflag 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).

-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings
Konrad Borowski
sumber
13
Saya tidak pernah repot untuk memeriksa ini sampai sekarang, tetapi sebenarnya, itu bukan tidak mungkin ... cobaint main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
user541686
2
Bahkan dengan program sepele ini saya masih bisa mendapatkan "peringatan: penggunaan stack adalah 16 byte [-Wstack-use =]" ;-)
Marc Glisse
7

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.optfile 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

Kyle Strand
sumber
Ini jawabannya. Gunakan daftar "tingkat atas", dan tambahkan semua argumen yang ada di tingkat atas (tidak diindentasi / bersarang). github.com/Barro/compiler-warnings/blob/master/gcc/…
Jetski S-type
6

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 }'

rockdaboot
sumber
3

Dari halaman ini :

Perhatikan bahwa beberapa bendera peringatan tidak tersirat oleh -Wall. Beberapa dari mereka memperingatkan tentang konstruksi yang secara umum tidak dianggap dipertanyakan oleh pengguna, tetapi kadang-kadang Anda ingin memeriksanya; yang lain memperingatkan tentang konstruksi yang perlu atau sulit untuk dihindari dalam beberapa kasus, dan tidak ada cara sederhana untuk memodifikasi kode untuk menekan peringatan. Beberapa dari mereka diaktifkan oleh -Wextratetapi banyak dari mereka harus diaktifkan secara individual.

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 -Walldan -Wextra. Ada juga -Wpedantic, meskipun Anda jelas ingin menjadi lebih gagah lagi =)

padi
sumber
"Dan aku masih tidak tahu apakah daftar ini komprehensif" ... ya, aku pasti bisa membaca halaman itu, tetapi pertanyaannya adalah, apakah itu komprehensif?
user541686
1
Saya tidak tahu ... Anda mungkin harus menelusuri kode sumber GCC. Apakah Anda mencoba menjadikan hidup Anda sebagai seorang programmer sangat sulit, atau adakah alasan kuat mengapa Anda ingin melihat setiap peringatan yang mungkin ada? =)
padi
2
Saya ingin melihat diagnosis kode GCC dari saya - saya merasa sangat membantu. Tapi jelas, jika saya sudah tahu tentang semua peringatan dan mana yang berguna (dan mana yang tidak), maka tidak akan ada yang bertanya. Tidak ada cara nyata bagi saya untuk memberi tahu kecuali saya mencobanya (dan misalnya saya menemukan yang membayangi bermanfaat, jadi tidak berarti mereka tidak berguna hanya karena dimatikan).
user541686
3

Dan saya masih tidak tahu apakah daftar ini komprehensif.

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.

Beberapa programmer Bung
sumber
3
Saya ditautkan ke halaman Ringkasan Opsi di jawaban saya, yang mengelompokkan semua opsi menjadi satu halaman. Kebijakan peninjauan kode GCC tidak mengizinkan opsi baru tanpa dokumentasi, sehingga dokumen harus komprehensif.
Jonathan Wakely