Как заставить GCC останавливаться после 5 ошибок?

80

Можно ли указать компилятору GNU c ++ останавливаться после обнаружения 5 ошибок? Не могу найти это в документации.

Егор256
источник

Ответы:

94

Параметр командной строки предписывает компилятору отказаться от выполнения после N ошибок. Эта опция присутствует в GCC 4.6 и новее.-fmax-errors=N

Параметр командной строки -Wfatal-errorsпредписывает компилятору отказаться от выполнения одной ошибки. Эта опция присутствует в GCC 4.0 и новее.

В обоих случаях предупреждения не учитываются при подсчете лимита, если вы не укажете другое значение -Werror.

Zwol
источник
5
Я бы дал это +1, но за утверждение о -Werror. Я считаю, что с предупреждениями абсолютно необходимо обращаться как с ошибками, потому что большинство предупреждений указывают на ошибочный код.
greyfade
3
@greyfade, я также считаю, что предупреждения обычно следует рассматривать как обязательные к исправлению, но, к сожалению, некоторые из предупреждений gcc могут срабатывать или нет в зависимости от уровня оптимизации, содержимого системных заголовков и любого количества других вещей, которые вы не можете легко контролировать . Таким образом, вы можете получить все предупреждения на своей канонической платформе (-ах) сборки, но затем какой-нибудь бедняга попытается построить в более экзотической среде, и она взорвется.
zwol
2
@Zack, разве не для этого -Wno-system-headers?
Sam Miller
2
Я слышал аргументы в пользу отказа от инициализации переменных, по которым компилятор получает -Wuninitializedложные срабатывания: он тратит I-кеш на мертвые, но не доказуемо мертвые инструкции хранения; и если что-то изменится, что делает предупреждение истинно положительным, мы хотим, чтобы valgrind его поймал.
zwol
3
К сожалению, компоновщик не поддерживает -fmax-errorsфлаг (в версии arm-none-eabi-gcc 5.4.1). Я использовал опцию -finstrument-functionsи получил сотни ошибок из-за неопределенной __cyg_profile_func_enterфункции.
lorcap 05
45

Вы можете использовать опцию gcc:

-fmax-errors=5

для этого.

user1993934
источник
9
@ Telthien Почему? Мне кажется, это ответ.
13
@Telthien stackoverflow.com/questions/how-to-answer говорит, что « полезен любой ответ, который направляет спрашивающего в правильном направлении» и «допустима краткость». Ответы призваны предоставить решение, которое иногда можно выразить одним предложением.
если он полезен как краткий, то нет причин затягивать ответ. Особенно не ради того, чтобы быть слишком длинным или просить об этом.
n611x007
1
Спасибо, что сообщили мне, что с тех пор, как я написал свой ответ, была добавлена ​​новая функция.
zwol
5

Я бы тоже приветствовал такой вариант. На данный момент я использую следующий обходной путь, чтобы получить первые пять ошибок:

<make> 2>&1|grep error|head -5
Томаш Романовски
источник
1

Я должен спросить, зачем вам это нужно. Иногда ошибка, которая существует в коде, не является первой и даже не входит в число первых пяти ошибок. Иногда это выходит за рамки этого, и его можно узнать только после прокрутки списка. Лучшим методом может быть разбиение вашего кода на меньшие библиотеки, если вас беспокоит время компиляции. Или, если вас беспокоит прокрутка экрана командной строки, используйте оператор «>>» для передачи сообщений в файл.

пшеница
источник
1
Это просто вопрос удобочитаемости журнала ошибок. 5 ошибок более чем достаточно для понимания проблемы, по крайней мере, в моем случае :)
yegor256
14
В самом деле? Мой опыт был прямо противоположным - особенно в C ++, если я не выполняю определенные виды рефакторинга, которые создают множество дискретных ошибок (например, изменение аргументов на часто используемый метод), самая первая ошибка, вероятно, будет единственный, который вообще может пригодиться.
zwol
@ FaZend.com Понятно, мне очень жаль, что я тогда не ответил. Ответ Зака ​​ниже, вероятно, лучшее, что вы получите, если только вы не собираетесь писать небольшой скрипт для анализа этой ошибки и прекращения процесса после вывода 5 ошибок. (хотя я могу быть совершенно не осведомлен в этом заявлении.)
Wheaties
1
Кажется, что у людей очень ограниченное воображение по этому поводу. Что насчет этого сценария? Вы только что впервые перенесли программу в новую среду. Вы получаете пару ошибок, и компиляция прерывается. Вы не представляете, сколько несовместимости существует между старой и новой средой. Вы хотите знать, насколько плоха ситуация и сколько проблем в вашем коде. Вы хотите собрать все ошибки в один огромный список, чтобы вы могли оценить, сколько времени у вас уйдет на их исправление.
Phill Apley
4
@PhillApley Проблема в том, что одна ошибка часто вызывает каскад дополнительных ошибок (некоторые с тоннами предложений STL), поэтому, если вы судите по объему ошибок и предупреждений, вы можете переоценить необходимые усилия и дать вверх.
Евгений Сергеев