web-gelistirme-sc.com

GCC'nin uyarıları TÜMÜ (kelimenin tam anlamıyla) nasıl açılır?

GCC'nin verdiği uyarıların - kelimenin tam anlamıyla - TÜMÜ özelliğini etkinleştirmek istiyorum. (Kolay olacağını düşünürdüm ...)

  • -Wall hile yapabilir, ama hayır! Hala -Wextra gerekli.

  • -Wextra hile yapabilir, ama hayır! Listelenen uyarıların tümü burada (örneğin, -Wshadow) bu özellik tarafından etkinleştirilmez. Ve bu listenin kapsamlı olup olmadığı hakkında hala hiçbir fikrim yok.

GCC'ye, sahip olduğu tüm uyarıları (eğer varsa ve, ya da ama!) tümünü etkinleştirmesini nasıl söylerim?

172
Mehrdad

Daha önceki cevapları tam anlamıyla tüm uyarıları mümkün kılmanın muhtemelen yararlı olmayacağına katılıyorum, ancak GCC bunu başarmak için uygun bir yol sunuyor. Komuta

gcc -Q --help=warning

etkin olup olmadıkları hakkında bilgiler içeren tüm desteklenen uyarı seçeneklerinin bir listesini sağlar. Bu arada, örneğin hangi seçeneklerin etkinleştirilmediğini (değil) bulmak için kullanılabilir. -Wall ve -Wextra

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

Tüm uyarıları etkinleştirmek için komut satırı parametrelerini çıkarmak için bazı regex kullanabilirsiniz.

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

Mevcut GCC'm için bu şunu veriyor:

-Wabi -Wabi-tag -Waddress -Waggregate-return -Waggressive loop optimizasyonları -Waliasing -Walign-commons -Wampersand -Warray-sınırlar -Warray-temporaries -Wassign-intercept -Wattributes -Wbad-fonksiyonu-cast -Wolol-kıyaslama -Wbuiltin-macro-yeniden tanımlanmış -Wc ++ - compat -Wc ++ 0x-compat -Wc ++ 14-compat -Wc-bağlama türü -Wc90-c99-uyumlu -Wc99-c11-uyumlu -Wcast-align -Wcast-qual -Wchar-aboneleri -Wcharacter-kısaltması -Wchkp -Wcbbered -Wcomment -Wcompare-reals -Wconditionally -Wcoverage -Wconversion -Wconversion -Wconversion -after-deyimi -Bilişsiz-tamamlanmamış -Belişsiz-sanal-dtor -Önemli -Sevişsiz-beyan-bildirimler -Açıklanmış-init -Besinsiz-optimizasyon -Wiskared-dizisi-elemeleri -Gisimsiz-elemeler -Wdiv-by-dizisi-yeterlilik -Weffc ++ -Beyaz vücut -Wendif-etiketleri -Wenum-karşılaştırması -Wextra -Wfloat-eşit -Wformat-içerir-nul -Wformat-ekstra-args -Wformat-non-literal -Wformat-güvenlik -Wformat-imza Wformat-y2k -Wformat-sıfır-uzunluk -Wfree-non-yığın-nesne -Beğitim-eleme -Kapalı-elemeler -Beyazsız -Genişli-işlev-bildirim -Beyazlı-int -Beyazlı-arayüz -Beyazlık-işaretçi-tipleri - Winherited-variadic-ctor -Winit-self-Winline -Wint-dönüştürme-İşaretçi-gösterici-döküm -Wintrinsic-shadow -Wintrinsics-std -Winvalid-bellek-modeli -Winvalid-offsetof -Winvalid-pch -Wjump-misses- init -Wline-truncation -Wliteral-sonek -Workbe-olmayan-parantez -W afrika-op-Uzun-uzun -Wmain -Wmaybe-başlatılmamış -Wemset-transged-args -Wmissing-brantes -Wmissing-declarations -Wmissing-field-başlatıcılar - Wmissing-include-dirs -Wmissing-parametre-tipi -Wmissing-prototipler -Wmultichar -Warrowing -Wnested-externs -Wnoexcept -Wnon-şablon-arkadaş -Wal-sanal-dtor -Wnonnull -Wodr -Wold-style-cast -Wold- Tarz-Beyannamesi -Toptan-Tarz-Tanımı -Wopenmp-Simd -Woverflow -Woverlength-stringler -Woverloaded-Sanal -Woverride-init -Wpacked -Wpacked-Bitfield-Uyumluluk -Wpadde d -Mayanlar -Wedantik -Wpmf-dönüşümler -Wointer-arith -Wointer-işareti -Wointer-to-int-döküm -Wpragmas -Wproperty-default -Wprotocol -Wreal-q-sabit -Wrealloc-lhs -Wrealloc-lhs- all -Wredundant-decls -Wreorder -Wreturn-yerel-addr -Wreturn-tipi -Wselector -Wwquency-noktası -Wshadow -Wshadow-ivar -Wshift-sayısı-negatif-Wshift-sayısı-taşması -Wsign-karşılaştırması -Wsign-promo- Wsized-deallocation -Wsizeof-array-argümanı -Wsizeof-pointer-memaccess -Wstack-koruyucusu -Wstrict-null-sentinel -Wstrict-prototipler -Wstrict-selector-match -Wsuggest-attribute = const -Wsuggest-attribute = format -Wsuggest-attribute = const -Wsuggest-attribute = format -Suggest- attribute = noreturn -Wsuggest-attribute = saf -Wsuggest-final-yöntemleri -Wugug-final-tipleri -Wsuggest-override -Wswitch -Wswitch -Wswitch-bool geçersiz kılma -Wswitch-default -Wswitch-enum -Wsync-nand -Wsnth-default -Wswitch-enum üstbilgiler -Wtabs -Wtarget-ömür boyu -Wtraditional -Wtraditional-dönüşüm -Wtrampolines -Wtrigraphs -Wtype-limitleri -Wundeclared-selector -Wundef -Wunderflow -Wuninitialized -Wunknown-pragmas -Wuns afe-loop-optimizasyonları -Kısa eklenmiş-yüzer-sabitler -Wunused -Wunused-ancak-set-parametresi -Wunused-ama-set-değişkeni -Wunused-kukla-argümanı -Wunused-fonksiyonu -Wunused-label -Wunused-local-typedefs- Wunused-makrolar -Wunused-parametre -Wunused-sonuç -Wuseused-değer -Wunused-değişken -Wuse-sadece-olmadan -Wuseless-cast -Wvarargs -Wvariadic-makrolar -Wvector-işlem-performans -Vvualual-hareket-ata -Wvla - Wvolatile-register-var -Wwrite-dizeleri -Wero-as-null-pointer-sabiti -Wzerotrip -frequire-return-deyimi

Bu şimdi GCC'yi, yani.

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

Bununla birlikte, bunun sadece bazı diller için mevcut olan bazı uyarı seçeneklerinden dolayı uyarılara yol açtığını unutmayın (ör. C++). Yalnızca mevcut dil için izin verilen seçenekleri içerecek daha fazla regex kullanarak ya da görüşmenin sonuna uygun bir -Wno-whatever ekleyerek bunlardan kaçınılabilir.

58
Haatschii

Tüm uyarıları etkin olarak programlamak imkansızdır (onları görmezden gelmeyecekseniz, ama sonra neden rahatsız ediyorsun?). Örneğin, şu bayrak dizisini kullandığınızı varsayalım: -Wstrict-prototypes -Wtraditional.

İki uyarı etkinleştirilse bile, aşağıdaki program şikayet eder.

/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) {
     ^

"Öyleyse eski stil prototipleri kullanacağım" diyebilirsiniz. Hayır, bu işe yaramayacak.

/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 isn’t a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

Ve hayır, herhangi bir prototip belirtmemek de yanlıştır, çünkü derleyici de şikayet edecektir.

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

Programınızın içinde herhangi bir işlevi tanımlarsanız, tüm bayrakları kullanamazsınız, çünkü derleyici akla gelebilecek işlev tanımlarından şikayetçi olur.

C++ için bu mümkün (-Wtraditional flag mevcut değil) ve çok basit programlar derlenebilir. Tüm uyarıları etkinleştirmek için, aşağıdaki uyarı listesini kullanın (muhtemelen bazı uyarılar çoğaltılır, çünkü -Wall tarafından etkinleştirilen uyarıları filtrelemeye zahmet etmedim).

-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
15
Konrad Borowski

Birisi, belirli bir GCC veya Clang sürümü için complete uyarı kümesini belirlemek için bir dizi araç yarattı.

GCC için, bu aracın derleyici sürümünüz için sağladığı tüm uyarı listesinden kopyalamak, tüm uyarılarının alınmasını sağlamak için yalnızca yoludur. açık olduğundan, (Clang'dan farklı olarak) GCC -Weverything sağlamaz.

Araç, GCC kaynak kodundaki gerçek c.opt dosyasını ayrıştırıyor gibi görünüyor, bu nedenle sonuçları kesin olmalı.

Depo ayrıca çoğu GCC ve Clang sürümleri için üretilmiş uyarı listelerini içeren metin dosyalarını da içerir (şu anda Clang 3.2 ila 3.7 ve GCC 3.4 ila 5.3).

https://github.com/barro/compiler-warnings

5
Kyle Strand

Gcc 4.3+ şimdi -Q --help = uyarılara sahiptir, sadece C ile ilgili uyarıları yazdırmak için --help = uyarıları, C bile belirtebilirsiniz.

Bundan yararlanmak için sadece bir m4 modülü yazdım (ayrıca clang'ın -Weverything özelliğini de destekliyorum), bakın wget_manywarnings.m4

Nasıl kullanılacağı oldukça basittir, temel olarak modül her uyarı bayrağını açar. Ve uyarıları gerektiği gibi kaldırıyorsunuz - bazıları gerçekten çok ayrıntılı. Örnek: configure.ac

Otomatik araçlar kullanmazsanız, m4 modülünde tüm devre dışı uyarıları etkinleştirmek için kullanılacak kodu bulacaksınız; bu, temel olarak awk aracılığıyla yönlendirilen gcc çağrısıdır:

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

5
rockdaboot

Ve bu listenin kapsamlı olup olmadığı hakkında hala hiçbir fikrim yok.

Muhtemelen öyle, ancak% 100 kapsamlı olan tek liste derleyici için gerçek kaynak. Ancak, GCC büyük! Ve tüm komut satırı parametrelerinin bir yerde toplanıp toplanmadığını veya birkaç kaynak dosyaya yayıldığını bilmiyorum. Ayrıca, bazı uyarıların ön işlemciler için, bazıları asıl derleyici için ve bazıları bağlayıcı için (tamamen ayrı bir programdır ve binutils paketinde bulunur) olduğunu ve bu nedenle büyük olasılıkla yayıldığını unutmayın.

3

Gönderen bu sayfa :

Bazı uyarı işaretlerinin _-Wall_ tarafından ima edilmediğini unutmayın. Bazıları, kullanıcıların genellikle şüpheli sayılmadığı, ancak zaman zaman kontrol etmek isteyebileceğiniz yapılar hakkında uyarır; Diğerleri, bazı durumlarda kaçınılması gereken veya zor olan yapılar hakkında uyarır ve uyarıyı bastırmak için kodu değiştirmenin basit bir yolu yoktur. Bazıları _-Wextra_ tarafından etkinleştirildi, ancak çoğunun ayrı ayrı etkinleştirilmesi gerekiyor.

Sanırım soru hangileri ? Belki de -W ile başlayan tüm satırlar için bu sayfayı grep olarak alabilir ve uyarı bayraklarının tam bir listesini alabilirsiniz. Sonra bunları _-Wall_ ve _-Wextra_ altındaki listelerle karşılaştırın. Ayrıca, _-Wpedantic_ da var, yine de hala daha bilgiçlikçi olmak istemenize rağmen =)

3
paddy