Làm cách nào để bật (theo nghĩa đen) TẤT CẢ các cảnh báo của GCC?


194

Tôi muốn kích hoạt - theo nghĩa đen - TẤT CẢ các cảnh báo mà GCC có. (Bạn sẽ nghĩ nó sẽ dễ dàng ...)

  • Bạn nghĩ rằng -Wallcó thể làm điều đó, nhưng không! Vẫn cần -Wextra.

  • Bạn nghĩ rằng -Wextracó thể làm điều đó, nhưng không! Không phải tất cả các cảnh báo được liệt kê ở đây (ví dụ -Wshadow:) được kích hoạt bởi điều này. Và tôi vẫn không biết nếu danh sách này là toàn diện.

Làm cách nào để tôi bảo GCC kích hoạt (không, nếu, và, nhưng!) Tất cả các cảnh báo mà nó có?


27
@Arafangion: Tôi không hiểu những gì "không rõ ràng" về câu hỏi - vâng, tôi muốn bật tất cả các cảnh báo có thể áp dụng cho mã của tôi, bất kể là phạm vi. Về lý do, nó rất đơn giản: Tôi đã tìm thấy một số cảnh báo không được bật bởi -Wall hoặc -Wextra sẽ hữu ích, và vì vậy tôi muốn thử phần còn lại để xem liệu tôi có thể cải thiện mã của mình không. Nó đơn giản như vậy.
dùng541686

12
@JoachimPileborg: "Bạn muốn trình biên dịch cảnh báo điều gì?" Lỗi tiềm năng và / hoặc phong cách xấu? Ý tôi là, nếu tôi biết tất cả các cảnh báo chính xác thì tôi sẽ chỉ bật chúng bằng tay, không cần phải đặt câu hỏi. Nếu câu trả lời thực sự là "bạn phải xem mã nguồn để tìm tất cả chúng" thì xin vui lòng gửi nó dưới dạng câu trả lời!
dùng541686

56
clang 3.1 cung cấp -Weverything.
Alexandre Hamez

5
@Arafangion Chà, câu hỏi được gắn thẻ C ++ nên ... :)
Một số lập trình viên anh chàng

5
@JoachimPileborg Và bây giờ (cuối cùng) có một cách tự động để trích xuất các cảnh báo từ nguồn: github.com/barro/compiler-warnings
Kyle Strand

Câu trả lời:


129

Bạn không thể.

Hướng dẫn sử dụng cho GCC 4.4.0 chỉ toàn diện cho phiên bản đó, nhưng nó liệt kê tất cả các cảnh báo có thể có cho 4.4.0. Chúng không phải là tất cả trên trang mà bạn liên kết đến, ví dụ, một số tùy chọn dành riêng cho ngôn ngữ nằm trên các trang dành cho tùy chọn C ++ hoặc tùy chọn Obj-C. Để tìm thấy tất cả, bạn nên nhìn vào Tóm tắt Tùy chọn

Bật tất cả mọi thứ sẽ bao gồm -Wdouble-promotionnhững thứ chỉ liên quan đến CPU với đơn vị dấu phẩy động chính xác đơn 32 bit, thực hiện floattrong phần cứng, nhưng mô phỏng doubletrong phần mềm. Làm các phép tính như doublesẽ sử dụng phần mềm mô phỏng và chậm hơn. Điều đó có liên quan đến một số CPU nhúng, nhưng hoàn toàn không liên quan đến CPU máy tính để bàn hiện đại có hỗ trợ phần cứng cho dấu phẩy động 64 bit.

Một cảnh báo khác thường không hữu ích là -Wtraditional, cảnh báo về mã được tạo hoàn hảo có ý nghĩa khác (hoặc không hoạt động) trong các "string " "concatenation"định nghĩa hàm C truyền thống, ví dụ , hoặc ISO C! Bạn có thực sự quan tâm về khả năng tương thích với trình biên dịch 30 năm tuổi? Bạn có thực sự muốn một cảnh báo cho văn bản int inc(int i) { return i+1; }?

Tôi nghĩ rằng -Weffc++quá ồn ào là không hữu ích, nó dựa trên phiên bản đầu tiên của C ++ hiệu quả đã lỗi thời và cảnh báo về các cấu trúc hoàn toàn hợp lệ của C ++ (và hướng dẫn đã thay đổi trong các phiên bản sau của cuốn sách.) Tôi không muốn cảnh báo rằng tôi chưa khởi tạo một std::stringthành viên trong nhà xây dựng của mình; Nó có một constructor mặc định thực hiện chính xác những gì tôi muốn, tại sao tôi phải viết m_str()để gọi nó? Các -Weffc++cảnh báo hữu ích là quá khó để trình biên dịch phát hiện chính xác (đưa ra các phủ định sai) và các cảnh báo không hữu ích, chẳng hạn như khởi tạo tất cả các thành viên một cách rõ ràng, chỉ tạo ra quá nhiều tiếng ồn, cho kết quả dương tính giả.

Luc Danton đã cung cấp một ví dụ tuyệt vời về các cảnh báo vô dụng từ -Waggregate-returnđó gần như chắc chắn không bao giờ có ý nghĩa đối với mã C ++.

tức là bạn không thực sự muốn tất cả các cảnh báo, bạn chỉ nghĩ rằng bạn làm.

Xem qua hướng dẫn, đọc về chúng, quyết định bạn có thể muốn bật, thử chúng. Đọc nhãn hiệu của trình biên dịch của bạn là một điều tốt TM dù sao, tham gia một cắt ngắn và cho phép cảnh báo bạn không hiểu không phải là một ý tưởng rất tốt, đặc biệt nếu đó là để tránh phải RTFM.

Bất cứ ai chỉ bật tất cả mọi thứ có lẽ đều làm như vậy bởi vì họ không biết gì vì hoặc một ông chủ tóc nhọn nói "không có cảnh báo."

Một số cảnh báo là quan trọng, và một số thì không. Bạn phải phân biệt đối xử hoặc bạn làm hỏng chương trình của bạn. Hãy xem xét, ví dụ , -Wdouble-promotion. Nếu bạn đang làm việc trên một hệ thống nhúng, bạn có thể muốn điều này; nếu bạn đang làm việc trên một hệ thống máy tính để bàn thì có lẽ bạn không làm thế. Và bạn có muốn -Wtraditionalkhông? Tôi nghi ngờ điều đó.

Chỉnh sửa: Xem thêm -Wall-all để kích hoạt tất cả các cảnh báo được đóng dưới dạng WONTFIX.

Chỉnh sửa 2: để đáp lại khiếu nại của DevSolar về các tệp tạo tệp cần sử dụng các cảnh báo khác nhau tùy thuộc vào phiên bản trình biên dịch, nếu -Wall -Wextrakhông phù hợp thì không khó để sử dụng CFLAGS dành riêng cho trình biên dịch:

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))

38
"Xem qua hướng dẫn, đọc về chúng, quyết định bạn có thể muốn bật, thử chúng." Vấn đề ở đây là các bước bạn bỏ qua: "Tái thăm hướng dẫn cho mỗi và mọi phiên bản trình biên dịch và thích ứng với danh sách các cảnh báo, vì họ là một thay đổi Hãy Makefiles bạn kiểm tra phiên bản trình biên dịch chính xác và sử dụng a. Khác nhau danh sách cảnh báo cho mỗi người trong số họ. " Chúng tôi có mức tối ưu hóa duy trì duy trì; Tại sao họ không thể bận tâm với việc cung cấp dịch vụ tương tự cho các cảnh báo?
DevSolar

17
@JonathanWakely: Tôi có các dự án của mình và GCC không nằm trong số đó. Tôi chỉ ra một điểm yếu trong sản phẩm của họ. Hoặc là họ sửa nó hoặc họ chấp nhận đổ lỗi cho việc không làm như vậy, nhưng tôi không thể sửa nó cho họ, OSS bị nguyền rủa.
DevSolar

14
@JonathanWakely: "Nếu bạn muốn một cái gì đó, hãy yêu cầu nó, đừng chê bai về nó." - Tôi không bắt buộc phải tham gia vào dự án GCC để phê bình nó, đặc biệt là nếu # 31573 đã được gắn cờ là WONTFIX. Điều đó đặt chủ đề này từ "hỏi về nó" vào sân bóng "bitch about it".
DevSolar

61
-WeverythingTôi nghĩ là giải pháp tốt hơn so với chiến lược gcc không đưa ra lựa chọn như vậy. Tôi sử dụng cờ đó với tiếng kêu vì triết lý của tôi là tôi muốn tất cả các cảnh báo theo mặc định (vì ai đó nghĩ rằng nó đủ hữu ích để thêm vào trình biên dịch) và nếu tôi không thích nó, tôi sẽ tắt cảnh báo đó một cách cụ thể. Vấn đề là bạn không biết về các cảnh báo không kích hoạt, nhưng bạn biết về các cảnh báo mà bạn không muốn kích hoạt và chúng dễ dàng bị tắt.
David Stone

17
@JonathanWakely Vâng, nhưng họ rất nhỏ bé. Cách dễ nhất để xem những cảnh báo nào thể liên quan đến mã của bạn là xem những cảnh báo nào được kích hoạt bởi mã của bạn; tại thời điểm đó, bạn có thể thấy một ví dụ thực tế có liên quan về mã nguy hiểm tiềm tàng trước khi quyết định có vô hiệu hóa cảnh báo hay không. Điều này có thể dễ dàng thực hiện với -Weverythingtùy chọn của Clang , nhưng không thể thực hiện được với GCC.
Kyle Strand

71

Tôi đồng ý với các câu trả lời trước đó rằng có thể không có lợi khi kích hoạt tất cả các cảnh báo theo nghĩa đen, tuy nhiên GCC cung cấp một cách hợp lý thuận tiện để đạt được điều này. Lệnh

gcc -Q --help=warning

cung cấp danh sách tất cả các tùy chọn cảnh báo được hỗ trợ với thông tin về việc chúng có hoạt động hay không. Bằng cách này, có thể được sử dụng để tìm ra tùy chọn nào (không) được bật bởi vd -Wall-Wextra

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

Để kích hoạt tất cả các cảnh báo, bạn có thể sử dụng một số biểu thức chính quy để trích xuất các tham số dòng lệnh

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

Đối với GCC hiện tại của tôi, điều này mang lại:

-Wabi -Wabi-tag -Waddress -Waggregate-return -WagTHERive-loop-tối ưu hóa -Waliasing -Walign-commons -Wampersand -Warray-bound -Warray-temaries -Wassign-intercept -Wbuiltin-macro-red xác định -Wc ++ - compat -Wc ++ 0x-compat -Wc ++ 14-compat -Wc-bind-type -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -War-subscriptts -Wcharacter-truncation -Wchkp -Wclobbered -Wcomment -Wcompare-reals -Wcond theo hỗ trợ -Wconversion -Wconversion-Extra -Wconversion-null -Wcoverage-mismatch -Wc -after-statement -Wdelete-không đầy đủ -Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-tuyên bố -Wdesignated-init -Wdisatted-tối ưu hóa -Wdiscarded-Array-Qualifier -Wdiscarded -Weffc ++ -Wempty-body-Wendif-nhãn -Wenum-so sánh -Wextra -Wfloat-bằng -Wformat-chứa-nul -Wformat-Extra-args -Wformat-nonliteral -Wformat-security -Wformat-Signness -Wformat-y2k -nonheap-object -Wfactor-Elimination -Wignored-Qualifier -Wimplicit -Wimplicit-function -lar -Wimplicit-int -Wimplicit-interface -Wimplicit-thủ tục -Wincomp tương thích-con trỏ-type -Winherited-matrix -Wint-convert -Wint -ins-cast -Wintrinsic-Shadow -Wintrinsics-std -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wjump-miss-init -Wline-truncation -not-ngoặc đơn -Wlogical-op -Wlong-long -Wmain -Wmaybe-uninitialized -Wmemset-transposed-args -Wmissing-braces -Wmissing-khai báo -Wmissing-field-khởi tạo -Wmissing -Wmissing-nguyên mẫu-Wmultichar -Wrowrowing -Wnested-externs -Wnoexcept -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-cast -Wold-style-statement -Wold-style-định nghĩa -Woverlength-chuỗi -Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpedantic -Wpmf-convert -Wpulum-arith -Wpulum-sign -Wpulum-sign -assign-default -Wprotatio -Wreal-q-hằng -Wrealloc-lhs -Wrealloc-lhs-all -Wredplus-Decs -Wreorder -Wreturn-local-addr -Wreturn-type -Wselector -W -Wshift-Count-neg -Wshift-Count-overflow -Wsign-so -Wsign-promo -Wsized-deallocation -Wsizeof-Array-argument -Wsizeof-con trỏ-memaccess -Wstack-Protector -Wstrict-null-sentinel -Wstrict-selector-match-Wsuggest-property = const -Wsuggest-property = format -Wsuggest-property = noreturn -Wsuggest-property = thuần -Wsuggest-Final-phương thức -Wsuggest-Final-type -Wsuggest-override -Wsurprising -Wswitch -Witch -default -Wswitch-enum -Wsync-nand -Wwnth -WW -Wunafe-loop-tối ưu hóa -Wunuffixed-float-constants -Wunuse -Wunuse-but-set-tham số -Wunuse-but-set-biến -Wunuse-dummy-argument -Wunuse-function -Wunuse-nhãn -Wunuse-local -Wun used-macros -Wunuse-tham số -Wunuse-result -Wunuse-value -Wunuse-biến -Wuse-without-only -Wusless-cast -Wvarargs -Wvariadic-macros -Wvector-oper-Performance -Wvirtual-move-Wvla -Wvoliverse-register-var -Wwrite-chuỗi -Wzero-as-null-con trỏ-hằng -Wzerotrip -frequire-return-statement

Điều này bây giờ có thể được sử dụng để gọi GCC, tức là

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

Tuy nhiên, lưu ý rằng điều này dẫn đến cảnh báo do một số tùy chọn cảnh báo chỉ khả dụng cho một số ngôn ngữ nhất định (ví dụ C++). Chúng có thể tránh được bằng cách sử dụng một số biểu thức chính quy khác để chỉ bao gồm các tùy chọn được phép cho ngôn ngữ hiện tại hoặc bằng cách thêm một thích hợp -Wno-whatevervào cuối cuộc gọi.


10
Tôi sợ nó không thực tế. Gcc đã cho tôi thấy những cảnh báo từ lib std.
Valentin Heinitz

13
@ValentinHeinitz Như tôi đã nói, tôi không nghĩ việc kích hoạt tất cả các cảnh báo theo nghĩa đen là đúng, nhưng đây là những gì OP yêu cầu. Tuy nhiên, tôi nghĩ rằng bằng cách loại bỏ rõ ràng một số cảnh báo có vấn đề đã được đề cập trong các câu trả lời khác (ví dụ: bằng cách thêm -Wno-bất cứ điều gì vào cuối cuộc gọi), điều này có thể được sử dụng thực tế.
Haatschii

6
@ValentinHeinitz Bạn có thể ngăn gcc đưa ra cảnh báo cho các tiêu đề hệ thống / std / bên thứ 3 bằng cách sử dụng -isystemthay vì -Icho các thư mục có liên quan.
Kyle Strand

4
Đây phải là câu trả lời được chấp nhận vì điều này thực sự và trực tiếp trả lời câu hỏi.
TFuto

16

Đơn giản là không thể lập trình với tất cả các cảnh báo được bật (trừ khi bạn sẽ bỏ qua chúng, nhưng sau đó, tại sao phải bận tâm?). Ví dụ: giả sử bạn sử dụng bộ cờ sau : -Wstrict-prototypes -Wtraditional.

Ngay cả khi có hai cảnh báo được bật, chương trình sau sẽ khiếu nại.

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

Bạn có thể nghĩ "tốt, tôi sẽ sử dụng các nguyên mẫu kiểu cũ rồi". Không, điều này sẽ không làm việc.

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

Và không, không chỉ định bất kỳ nguyên mẫu nào cũng sai, vì trình biên dịch cũng sẽ phàn nàn.

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

Nếu bạn xác định bất kỳ chức năng nào trong chương trình của mình, bạn không thể sử dụng tất cả các cờ, vì trình biên dịch sẽ phàn nàn về bất kỳ định nghĩa hàm có thể tưởng tượng nào.

Đối với C ++, điều này là có thể ( -Wtraditionalcờ không tồn tại) và các chương trình rất đơn giản có thể được biên dịch. Để bật tất cả các cảnh báo, hãy sử dụng danh sách cảnh báo sau (có thể một số cảnh báo được sao chép, vì tôi không bận tâm đến việc lọc các cảnh báo được kích hoạt bởi -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

13
Tôi chưa bao giờ bận tâm kiểm tra điều này cho đến bây giờ, nhưng thực ra, không phải là không thể ... thửint main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
user541686

2
Ngay cả với chương trình tầm thường này, tôi vẫn có thể nhận được "cảnh báo: mức sử dụng ngăn xếp là 16 byte [-Wstack-used =]" ;-)
Marc Glisse

7

Ai đó đã tạo ra một bộ công cụ để xác định bộ cảnh báo hoàn chỉnh cho một phiên bản GCC hoặc Clang nhất định.

Đối với GCC, sao chép từ danh sách đầy đủ các cảnh báo được cung cấp bởi công cụ này cho phiên bản trình biên dịch của bạn dường như là cách duy nhất để đảm bảo rằng tất cả các cảnh báo được bật, vì (không giống như Clang) GCC không cung cấp -Weverything.

Công cụ dường như phân tích c.opttệp thực tế trong mã nguồn GCC, vì vậy kết quả của nó phải rõ ràng.

Kho lưu trữ cũng chứa các tệp văn bản với các danh sách cảnh báo được tạo cho hầu hết các phiên bản GCC và Clang (hiện tại Clang 3.2 đến 3.7 và GCC 3.4 đến 5.3).

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


Đây là câu trả lời. Sử dụng danh sách "cấp cao nhất" và thêm tất cả các đối số ở cấp cao nhất (không được thụt lề / lồng nhau). github.com/Barro/compiler-warnings/blob/master/gcc/NH
Jetski S-type

6

Gcc 4.3+ hiện có -Q --help = cảnh báo, thậm chí bạn có thể chỉ định --help = cảnh báo, C để chỉ in ra các cảnh báo liên quan đến C.

Tôi vừa viết một mô-đun m4 để tận dụng lợi thế này (cũng hỗ trợ clang's -Weverything), xem wget_manywarnings.m4

Cách sử dụng khá đơn giản, về cơ bản mô-đun bật mọi cờ cảnh báo. Và bạn loại bỏ các cảnh báo khi cần thiết - một số thực sự rất dài dòng. Ví dụ: configure.ac

Nếu bạn không sử dụng chế độ tự động, bạn sẽ tìm thấy mã để bật tất cả các cảnh báo bị vô hiệu hóa trong mô-đun m4, về cơ bản là cuộc gọi gcc được chuyển qua 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 }'


3

Từ trang này :

Lưu ý rằng một số cờ cảnh báo không được ngụ ý bởi -Wall. Một số trong số họ cảnh báo về các công trình mà người dùng thường không xem xét nghi vấn, nhưng đôi khi bạn có thể muốn kiểm tra; những người khác cảnh báo về các công trình cần thiết hoặc khó tránh trong một số trường hợp và không có cách nào đơn giản để sửa đổi mã để triệt tiêu cảnh báo. Một số trong số chúng được kích hoạt bởi -Wextranhưng nhiều trong số chúng phải được kích hoạt riêng lẻ.

Tôi đoán câu hỏi là cái nào? Có lẽ bạn có thể grep trang đó cho tất cả các dòng bắt đầu bằng -W và nhận danh sách đầy đủ các cờ cảnh báo. Sau đó so sánh những người với danh sách dưới -Wall-Wextra. Ngoài ra còn có -Wpedantic, mặc dù bạn rõ ràng là muốn thậm chí còn hơn thế nữa =)


"Và tôi vẫn không biết danh sách này có đầy đủ không" ... vâng, tôi chắc chắn có thể grep trang đó, nhưng câu hỏi đặt ra là nó có toàn diện không?
dùng541686

1
Tôi không biết ... Bạn có thể phải rót qua mã nguồn GCC. Bạn đang cố gắng để làm cho cuộc sống của bạn như là một lập trình viên cực kỳ khó khăn, hoặc có một lý do chính đáng tại sao bạn muốn xem mọi cảnh báo có thể hiểu được? =)
thóc

2
Tôi muốn xem chẩn đoán mã của GCC - Tôi thấy nó thực sự hữu ích. Nhưng rõ ràng, nếu tôi đã biết về tất cả các cảnh báo và những cảnh báo nào hữu ích (và những cảnh báo nào không hữu ích), thì sẽ không có gì để hỏi. Không có cách nào thực sự để tôi nói trừ khi tôi thử chúng (và ví dụ tôi thấy cái bóng tối hữu ích, vì vậy nó không giống như chúng vô dụng chỉ vì chúng bị tắt).
dùng541686

3

Và tôi vẫn không biết nếu danh sách này là toàn diện.

Có lẽ là vậy, nhưng danh sách duy nhất toàn diện 100% là nguồn thực sự cho trình biên dịch. Tuy nhiên, GCC là lớn ! Và tôi không biết nếu tất cả các tham số dòng lệnh được thu thập ở một nơi hoặc trải ra trên một số tệp nguồn. Cũng lưu ý rằng một số cảnh báo dành cho bộ xử lý trước, một số cho trình biên dịch thực tế và một số cho trình liên kết (là một chương trình hoàn toàn riêng biệt và được tìm thấy trong gói binutils) nên rất có thể chúng được trải ra.


3
Tôi đã liên kết với trang Tóm tắt Tùy chọn trong câu trả lời của mình, nhóm này sẽ nhóm tất cả các tùy chọn vào một trang. Chính sách xem xét mã GCC không cho phép các tùy chọn mới mà không có tài liệu, vì vậy các tài liệu phải toàn diện.
Jonathan Wakely
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.