Jak nakazać GCC zatrzymanie się po 5 błędach?


80

Czy można poinstruować kompilator GNU c ++, aby zatrzymał się po znalezieniu 5 błędów? Nie mogę znaleźć tego w dokumentacji.

Odpowiedzi:


94

Opcja wiersza poleceń nakazuje kompilatorowi zrezygnować po N błędach. Ta opcja jest dostępna w GCC 4.6 i nowszych.-fmax-errors=N

Opcja wiersza polecenia -Wfatal-errorsnakazuje kompilatorowi zrezygnowanie po jednym błędzie. Ta opcja jest dostępna w GCC 4.0 i nowszych.

W obu przypadkach ostrzeżenia nie wliczają się do limitu, chyba że określisz również -Werror.


5
Dałbym to +1, ale za oświadczenie o -Werror. Uważam, że ostrzeżenia absolutnie należy traktować tak, jakby były błędami, ponieważ większość ostrzeżeń wskazuje na błędny kod.
greyfade,

3
@greyfade, uważam również, że ostrzeżenia powinny być generalnie traktowane jako konieczne do naprawienia, ale niestety niektóre ostrzeżenia gcc mogą wyzwalać lub nie w zależności od poziomu optymalizacji, zawartości nagłówków systemowych i wielu innych rzeczy, których nie można łatwo kontrolować . W ten sposób możesz otrzymać wszystkie ostrzeżenia na platformie (platformach) do budowania kanonicznego, ale potem jakiś biedny głupek spróbuje zbudować w bardziej egzotycznym środowisku i wybuchnie.
zwol

2
@Zack, czy nie do tego służy nagłówki -Wno-system-headers?
Sam Miller,

2
Argumenty, które słyszałem, aby nie inicjalizować zmiennych, w przypadku których kompilator otrzymuje -Wuninitializedfałszywe alarmy, to: marnuje pamięć podręczną I-cache na martwe, ale niemożliwe do udowodnienia, martwe instrukcje; a jeśli coś się zmieni, co sprawi, że ostrzeżenie stanie się naprawdę pozytywne, chcemy, aby Valgrind je złapał.
zwol

3
Niestety, linker nie honoruje -fmax-errorsflagi (od arm-none-eabi-gcc 5.4.1). Używałem opcji -finstrument-functionsi otrzymałem setki błędów z powodu niezdefiniowanej __cyg_profile_func_enterfunkcji.
lorcap

45

Możesz użyć opcji gcc:

-fmax-errors=5

w tym celu.


9
@Telthien Dlaczego? To wydaje mi się odpowiedzią.

13
@Telthien stackoverflow.com/questions/how-to-answer mówi, że „każda odpowiedź, która sprawi, że osoba pytająca pójdzie we właściwym kierunku, jest pomocna”, a „zwięzłość jest akceptowalna”. Odpowiedzi mają na celu dostarczenie rozwiązania, które czasami można zrealizować w jednym zdaniu.

jeśli jest przydatna tak krótko, nie ma powodu, aby wydłużać odpowiedź. Zwłaszcza nie po to, żeby być przesadnym lub prosić o tldr.
n611x007

1
Dziękuję za powiadomienie mnie, że od czasu napisania odpowiedzi została dodana nowa funkcja.
zwol

5

Byłbym również zadowolony z takiej opcji. Na razie używam następującego obejścia, aby uzyskać pierwsze pięć błędów:

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

1

Muszę zapytać, dlaczego chcesz to zrobić. Czasami błąd, który istnieje w kodzie, nie jest pierwszym, ani nawet nie występuje w pierwszych pięciu błędach. Czasami jest poza tym i jest rozpoznawalny dopiero po przewinięciu listy. Lepszą metodą może być rozbicie kodu i umieszczenie go w mniejszych bibliotekach, jeśli przeszkadzają Ci czasy kompilacji. Lub jeśli martwisz się przewijaniem z ekranu wiersza poleceń, użyj operatora „>>”, aby przesłać komunikaty do pliku.


1
To tylko kwestia czytelności dziennika błędów. 5 błędów w zupełności wystarczy, aby zrozumieć problem, przynajmniej w moim przypadku :)
yegor256

14
Naprawdę? Moje doświadczenie jest zupełnie odwrotne - szczególnie w C ++, chyba że wykonuję określone rodzaje prac refaktoryzacyjnych, które powodują wiele dyskretnych błędów (zmieniając argumenty na powszechnie używaną metodę, np.), Prawdopodobnie pierwszy błąd wystąpi jedyny, który jest w ogóle przydatny.
zwol

@ FaZend.com Widzę, przepraszam, że nie odpowiedziałem. Odpowiedź Zacka poniżej jest prawdopodobnie najlepszą, do której dojdziesz, chyba że napiszesz mały skrypt, który przeanalizuje te błędy i zabije proces po wyświetleniu 5 błędów. (chociaż mogę być całkiem ignorantem w tym stwierdzeniu).
wheaties

1
Wydaje się, że ludzie mają bardzo ograniczoną wyobraźnię w tej kwestii. A co z tym scenariuszem? Właśnie przeportowałeś program po raz pierwszy do nowego środowiska. Pojawia się kilka błędów i kompilacja zostaje przerwana. Nie masz pojęcia, ile jest niezgodności między starym i nowym środowiskiem. Chcesz wiedzieć, jak zła jest sytuacja i ile problemów zawiera Twój kod. Chciałbyś zebrać wszystkie błędy na jednej ogromnej liście, abyś mógł oszacować, ile czasu zajmie Ci ich naprawienie.
Phill Apley

4
@PhillApley Problem polega na tym, że pojedynczy błąd często wywołuje kaskadę błędów przepływu (niektóre z tonami sugestii STL), więc jeśli oceniasz liczbę błędów i ostrzeżeń, możesz przecenić wymagany wysiłek i dać w górę.
Evgeni Sergeev
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.