Làm thế nào để hướng dẫn GCC dừng lại sau 5 lỗi?


80

Có thể hướng dẫn trình biên dịch GNU c ++ dừng sau 5 lỗi được tìm thấy không? Không thể tìm thấy điều này trong tài liệu.

Câu trả lời:


93

Tùy chọn dòng lệnh hướng trình biên dịch từ bỏ sau N lỗi. Tùy chọn này có trong GCC 4.6 trở lên.-fmax-errors=N

Tùy chọn dòng lệnh -Wfatal-errorshướng dẫn trình biên dịch từ bỏ sau một lỗi. Tùy chọn này có trong GCC 4.0 trở lên.

Trong cả hai trường hợp, cảnh báo không được tính vào giới hạn trừ khi bạn cũng chỉ định -Werror.


5
Tôi muốn cho +1 này nhưng cho tuyên bố về -Werror. Tôi tin rằng các cảnh báo hoàn toàn nên được xử lý như thể chúng là lỗi, bởi vì hầu hết các cảnh báo là dấu hiệu của mã lỗi.
greyfade

3
@greyfade, tôi cũng nghĩ rằng các cảnh báo nói chung nên được coi là phải sửa, nhưng rất tiếc là một số cảnh báo của gcc có thể kích hoạt hoặc không tùy thuộc vào mức độ tối ưu hóa, nội dung của tiêu đề hệ thống và bất kỳ thứ gì khác mà bạn không thể kiểm soát dễ dàng . Do đó, bạn có thể nhận được tất cả các cảnh báo trên (các) nền tảng xây dựng chuẩn của mình, nhưng sau đó, một số kẻ xấu cố gắng xây dựng trong một môi trường kỳ lạ hơn và nó bị nổ tung.
zwol

2
@Zack, đó không phải là những gì -Wno-system-headers dùng để làm gì?
Sam Miller

2
Các đối số mà tôi đã nghe về việc không khởi tạo các biến mà trình biên dịch nhận được -Wuninitializedkết quả dương tính giả là: nó lãng phí I-cache trên các lệnh lưu trữ dead-but-not-provied-dead; và nếu có điều gì đó thay đổi khiến cảnh báo trở thành tích cực thực sự, chúng tôi muốn người có giá trị nắm bắt được.
zwol

3
Rất tiếc, trình liên kết không tôn trọng -fmax-errorscờ (kể từ arm-none-eabi-gcc 5.4.1). Tôi đang sử dụng tùy chọn -finstrument-functionsvà tôi gặp hàng trăm lỗi do __cyg_profile_func_enterchức năng không xác định .
lorcap

45

Bạn có thể sử dụng tùy chọn gcc:

-fmax-errors=5

vì mục đích này.


9
@Telthien Tại sao? Đây dường như là một câu trả lời cho tôi.

13
@Telthien stackoverflow.com/questions/how-to-answer cho biết "bất kỳ câu trả lời nào khiến người hỏi đi đúng hướng đều hữu ích" và "sự ngắn gọn có thể chấp nhận được". Các câu trả lời được thiết kế để cung cấp một giải pháp, đôi khi có thể được hoàn thành trong một câu duy nhất.

nếu nó hữu ích như ngắn thì không có lý do gì để kéo dài câu trả lời. Đặc biệt là không vì lợi ích của sức mạnh quá mức hoặc yêu cầu-cho-tldr.
n611x007 16/09/13

1
Cảm ơn vì đã cho tôi biết rằng một tính năng mới đã được thêm vào kể từ khi tôi viết câu trả lời của mình.
zwol

5

Tôi cũng hoan nghênh một lựa chọn như vậy. Hiện tại, tôi đang sử dụng giải pháp sau để gặp năm lỗi đầu tiên:

<make> 2>&1|grep error|head -5

1

Tôi phải hỏi tại sao bạn muốn làm điều này. Đôi khi lỗi tồn tại trong mã không phải là lỗi đầu tiên hoặc thậm chí được tìm thấy trong năm lỗi đầu tiên. Đôi khi, nó vượt quá mức đó và chỉ có thể nhận ra khi bạn cuộn xuống danh sách. Một phương pháp tốt hơn có thể là chia nhỏ mã của bạn và đặt nó vào các thư viện nhỏ hơn nếu bạn thấy phiền bởi thời gian biên dịch. Hoặc nếu bạn lo lắng về những thứ cuộn ra khỏi màn hình của dòng lệnh, hãy sử dụng toán tử '>>' để chuyển các thông báo vào một tệp.


1
Đó chỉ là vấn đề về khả năng đọc nhật ký lỗi. 5 lỗi là quá đủ để hiểu được vấn đề, ít nhất là trong trường hợp của tôi :)
yegor256

14
Có thật không? Kinh nghiệm của tôi thì ngược lại - đặc biệt là trong C ++, trừ khi tôi đang thực hiện các loại công việc tái cấu trúc cụ thể tạo ra nhiều lỗi rời rạc (ví dụ: thay đổi các đối số thành một phương thức thường dùng) thì lỗi đầu tiên có thể xảy ra cái duy nhất có công dụng.
zwol,

@ FaZend.com Tôi hiểu rồi, tôi xin lỗi vì tôi đã đưa ra câu trả lời không phải là câu trả lời. Câu trả lời của Zack dưới đây có lẽ là câu trả lời tốt nhất mà bạn sẽ gặp phải trừ khi bạn định viết một đoạn script nhỏ để phân tích cú pháp lỗi này và kết thúc quá trình sau khi 5 lỗi được xuất ra. (mặc dù tôi có thể là khá ngu dốt trong bản Tuyên Bố này.)
wheaties

1
Mọi người dường như có trí tưởng tượng rất hạn chế về vấn đề này. Còn về kịch bản này? Bạn vừa chuyển một chương trình sang một môi trường mới lần đầu tiên. Bạn gặp một vài lỗi và quá trình biên dịch bị hủy bỏ. Bạn không biết có bao nhiêu điểm không tương thích giữa môi trường cũ và môi trường mới. Những gì bạn muốn biết là tình hình tồi tệ như thế nào và có bao nhiêu vấn đề trong mã của bạn. Bạn muốn lấy tất cả các lỗi trong một danh sách khổng lồ để bạn có thể ước tính xem mình sẽ mất bao lâu để sửa tất cả.
Phill Apley

4
@PhillApley Vấn đề với điều đó là một lỗi duy nhất thường tạo ra một loạt các lỗi quy trình (một số có hàng tấn đề xuất STL), vì vậy nếu bạn đánh giá theo khối lượng lỗi và cảnh báo, bạn có thể đánh giá quá cao nỗ lực cần thiết và đưa ra lên.
Evgeni Sergeev
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.