Các tùy chọn cảnh báo gcc được đề xuất cho C [đã đóng]


83

Ngoài -Tất cả những cảnh báo nào khác mà mọi người thấy hữu ích?

http://gcc.gnu.org/onlineocs/gcc-4.3.2/gcc/Warning-Options.html

Câu trả lời:


48

Tôi thường xuyên sử dụng:

    gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
        -Wstrict-prototypes -Wmissing-prototypes

Bộ này bắt rất nhiều đối với những người không sử dụng nó (những người có mã mà tôi nhận được để biên dịch với các cờ đó lần đầu tiên); nó hiếm khi mang lại cho tôi một vấn đề (mặc dù -Wcast-quality đôi khi gây phiền toái).


1
Những ngày này, tôi thấy mình phải thêm ' -Wdeclaration-after-statement' để phát hiện mã mà MSVC (về cơ bản vẫn là trình biên dịch C89) sẽ không xử lý. Thật là phiền phức. Thêm ' -Wextra' cũng có thể phát hiện một số vấn đề khác.
Jonathan Leffler

2
Ngoài ra, bạn nên thêm -O3hoặc một cái gì đó tương tự; có những cảnh báo chỉ được tạo ra khi mã được tối ưu hóa.
Jonathan Leffler

3
theo gcc doc, -O2 là tốt nhất để phát hiện cảnh báo. Tôi không chắc liệu -O3 có ngụ ý -O2 hay cho phép tạo thêm cảnh báo hay không.
Offirmo

3
Bỏ qua -m64 nếu bạn không ở trong môi trường 64 bit.
Tor Klingberg

1
Sử dụng cả hai -m32 -m64 (tất nhiên là trong các lần chạy riêng biệt) cung cấp khả năng bảo vệ tốt hơn khỏi các lỗi khác nhau trong cách bạn sử dụng printf()scaf()thông số kỹ thuật chuyển đổi.
Jonathan Leffler

40

Kể từ 2011/09/01, với phiên bản gcc 4.6.1

Bí danh "phát triển" hiện tại của tôi

gcc -std = c89 -pedantic -Wall \
    -Không thiếu dấu ngoặc nhọn -Wextra -Không thiếu-trường-khởi tạo -Wformat = 2 \
    -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \
    -Wbad-function-cast -Wstrict -flow = 5 -Các nguyên mẫu hạn chế -Winline \
    -Wundef -Wnested-externs -Wcast-quality -Wshadow -Wunreachable-code \
    -Wlogical-op -float-bằng -Wstrict-aliasing = 2 -Wredundant-decls \
    -Định nghĩa kiểu vàng -Werror \
    -ggdb3 \
    -O0 \
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \
    -lm

Bí danh "phát hành"

gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm

Kể từ ngày 11 tháng 11 năm 2009

bí danh "phát triển"

gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \
    -Wbad-function-cast - Nguyên mẫu hạn chế - Đường dây -Wundef -Wnested-externs \
    -Wcast-quality -Wshadow -Wwrite-string -Wconversion -Wunreachable-code \
    -Wstrict-aliasing = 2 -ffloat-store -fno-common -fstrict-aliasing \
    -lm -std = c89 -pedantic -O0 -ggdb3 -pg - mức độ phù hợp

bí danh "phát hành"

gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops

1
-Wfloat-equalđược thêm vào bí danh của tôi. Cảm ơn bạn Mark
pmg

4
Lưu ý rằng -Wstrict-aliasing=2thực sự làm giảm mức cảnh báo được -Wstrict-aliasing=3ngụ ý bởi -Wall, ít nhất là với phiên bản gcc gần đây.
nwellnhof,

15

Tôi thích -Werror. Giữ cảnh báo mã miễn phí.


21
Không có -Werror tất cả các tùy chọn cảnh báo khác đều vô nghĩa. Xử lý các cảnh báo là lỗi là cách duy nhất để đảm bảo các cảnh báo được giải quyết. Nếu chúng chỉ là cảnh báo, một nhà phát triển có thể quyết định để lại một cái vì anh ta chắc chắn nó không hợp lệ. Nó thậm chí có thể đúng, nhưng nhà phát triển tiếp theo sẽ không sửa các cảnh báo mà anh ta đã giới thiệu vì anh ta không nhìn thấy nó giữa tất cả những người khác hoặc vì đó chỉ là một cảnh báo nữa.
Kristof Provost,

6
Tôi không đồng ý với Kristof, bởi vì nhiều lần, tôi chỉ muốn lấy một bản sao làm việc được biên dịch trước và sau đó giải quyết các lỗi.
Yktula

9
Tôi hiểu tại sao điều đó lại hấp dẫn, nhưng khi / nếu bạn có một bản sao đang hoạt động, bạn sẽ có nhiều khả năng để nó như cũ vì "nó hoạt động". Rủi ro này thậm chí còn cao hơn trong môi trường công ty, nơi bạn sẽ phải thuyết phục sếp cho bạn một khoảng thời gian để sửa các cảnh báo.
JesperE

2
Tôi xem xét việc loại bỏ #warningmột tác dụng phụ tốt khi sử dụng -Werror.
JesperE

3
nếu bạn làm việc trên Nguồn mở, nội dung không được sử dụng -Werrortheo mặc định trong các bản dựng của bạn, nó sẽ làm phiền những người đóng gói đang sử dụng các phiên bản trình biên dịch khác với bạn vì các cảnh báo thay đổi theo phiên bản trình biên dịch đôi khi mã được cảnh báo miễn phí cho bạn sẽ có cảnh báo cho người khác và thì họ phải đào sâu vào hệ thống xây dựng của bạn để tắt nó đi.
Spudd86

15

Tôi đã bắt đầu với C ++, vì vậy khi tôi chuyển sang học CI, hãy chắc chắn rằng:

-fmessage-length = 0
-ansi -pedantic -std = c99
- Lỗi
-Tường
-Wextra
-Viết-chuỗi
-Đơn vị tự
-Wcast-align
-Chất lượng phát sóng
-Wpointer-arith
-Giá răng cưa
-Wformat = 2
-Khai báo
-Xem-bao-dirs
-Không-không-sử dụng-tham số
-Được vệ sinh
-Định nghĩa phong cách vàng
- Nguyên mẫu hạn chế
- Nguyên mẫu thử nghiệm

5
Bạn có thể sử dụng -ansi -pedantic -std = c99 cùng lúc không? -Ansi không phải là điều tương tự như c89? và nếu có thì điều đó hoạt động như thế nào với cờ c99?
Johan

2
@Johan - bạn có thể, và nó không thực sự cần thiết, như tôi đã tìm hiểu gần đây. -ansi ngụ ý -std = <default>, vì vậy thực sự bạn có thể chỉ cần nói -std = c99 -pedantic và nhận được chính xác hiệu ứng tương tự. Dù sao thì tôi cũng có xu hướng sử dụng nó, chỉ cho hiệu ứng tài liệu. Tôi cảm thấy rằng nó đọc, "Mã này là tiêu chuẩn ANSI (pedantic!), Sử dụng tiêu chuẩn C99." Ngay sau đó thường đến -Không-dài-dài hoặc tương tự ... bất kỳ ngoại lệ nào đối với tiêu chuẩn ANSI.
Tom

9

Nhận hướng dẫn sử dụng cho phiên bản GCC bạn sử dụng, tìm tất cả các tùy chọn cảnh báo có sẵn , sau đó chỉ hủy kích hoạt những phiên bản mà bạn có lý do thuyết phục để làm như vậy. (Ví dụ: tiêu đề của bên thứ ba không thể sửa đổi sẽ cung cấp cho bạn nhiều cảnh báo nếu không.) Ghi lại những lý do đó. (Trong Makefile hoặc bất cứ nơi nào bạn đặt các tùy chọn đó.) Xem lại các cài đặt tại intervalls thông thường và bất cứ khi nào bạn nâng cấp trình biên dịch của mình.

Trình biên dịch là bạn của bạn. Cảnh báo là bạn của bạn. Cho trình biên dịch càng nhiều cơ hội để cho bạn biết về các vấn đề tiềm ẩn càng tốt.


1
FYI, sách hướng dẫn không cung cấp một danh sách cảnh báo toàn diện. Tuy nhiên, bạn có thể tìm thấy các danh sách như vậy ở đây , cùng với các công cụ được sử dụng để tạo chúng.
Kyle Strand

5

Tôi cũng dùng:

-Khoan tràn = 5

Để bắt những lỗi khó chịu có thể xảy ra nếu tôi viết mã dựa trên hành vi tràn của số nguyên.

Và:

-Wextra

Điều này cũng cho phép một số tùy chọn tốt. Hầu hết là cho C ++.


4
-Wextra dường như là tên mới của -W (Cái này cũng vẫn được hỗ trợ)
Sard 30/09/08

2

Tôi thường biên dịch với "-W -Wall -ansi -pedantic", điều này giúp đảm bảo chất lượng và tính di động tối đa của mã.


3
chỉ là một ghi chú -ansi ghi đè -std = c99
Sard 30/09/08

2
-Ansi không tương đương với việc sử dụng -std = c89 sao?
helpermethod

2

-pedantic-Tường -Wextra -Không-ghi-chuỗi -Không-không sử dụng-tham số

Đối với chế độ "Hurt me much", tôi bỏ qua -Wno ...

Tôi muốn có cảnh báo mã của mình miễn phí, đặc biệt là với C ++. Trong khi các cảnh báo của trình biên dịch C thường có thể bị bỏ qua, nhiều cảnh báo C ++ cho thấy các lỗi cơ bản trong mã nguồn.


3
Bởi vì chuỗi công cụ có quyền tự do đưa các ký tự chuỗi vào bộ nhớ chỉ đọc.
DevSolar

3
Tại sao -Không-không-dùng-tham số? Rất hiếm khi nó chỉ ra các vấn đề thực sự (và "rất hiếm khi" mối nguy hiểm chính xác khi vô hiệu hóa nó: lỗi không thể xử lý được là thứ tồi tệ nhất để phát hiện). Ví dụ, if có thể kích hoạt Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> tương đối khó phát hiện. Nếu bạn thấy khó chịu với cảnh báo đó, bạn chỉ nên dùng thông số foo (int /*q*/)này, điều này cũng làm tăng khả năng đọc mã của bạn.
Sebastian Mach

Trong quá trình tái cấu trúc, đôi khi tôi đã làm mờ thông số do nhầm lẫn với một địa chỉ, nó cũng giúp nắm bắt được điều đó
paulm

1

-pedantic-error


2
@unexist Hãy thử cài đặt clang(trình biên dịch C của dự án LLVM) và sau đó biên dịch -Weverythingvà bạn sẽ thấy việc biên dịch vui nhộn có thể thực sự trở nên như thế nào (một số cảnh báo hoàn toàn điên rồ, nhưng chúng đúng về mặt kỹ thuật).
Mecki


1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-implicit-function-khai báo -Không sử dụng -Không-không-sử dụng-giá trị -Kiểu quay lại


1

Ngay bây giờ tôi sử dụng:

-Wall -W -Wextra -Wconversion -Wshadow -Wcast-quality -Wwrite-string -Werror

Tôi lấy danh sách đó chủ yếu từ cuốn sách "Giới thiệu về gcc" và sau đó là một số từ gợi ý của Ulrich Drepper về Lập trình Phòng thủ ( http://people.redhat.com/drepper/Defensive-slides.pdf ).

Nhưng tôi không có bất kỳ khoa học nào đằng sau danh sách của mình, nó giống như một danh sách tốt.

/ Johan


Lưu ý: Tôi không thích những lá cờ khổng lồ đó ....

Lưu ý: Tôi nghĩ rằng -W và -Wextra ít nhiều giống nhau.


2
Không thích sử dụng -Wconversion và dành vài giờ để thử nghiệm các kiểu dữ liệu khác nhau trong mã của tôi và xây dựng lại, tôi đã nghiên cứu -Wconversion và không khuyên bạn nên sử dụng nó nói chung. Vấn đề là nó tạo ra các cảnh báo về mã như: char a = 5; char b = a - 1; Điều này đang sử dụng gcc 4.3.2 (Debian 4.3.2.-1.1)
James Morris

1
-Các cảnh báo chuyển đổi có thể được loại bỏ bằng (ví dụ trong nhận xét trên): char a = 5; char b = (char) (a - 1); dấu ngoặc ghi chú.
James Morris

1

Tôi thường chỉ sử dụng

gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o

1

Cảnh báo về các biến chưa được khởi tạo không hoạt động trừ khi bạn chỉ định -O, vì vậy tôi đưa nó vào danh sách của mình:

-g -O -Wall -Werror -Wextra -pedantic -std=c99

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.