Як доручити GCC зупинитися після 5 помилок?


80

Чи можна доручити компілятору GNU c ++ зупинитися після 5 виявлених помилок? Не вдається знайти це в документації.

Відповіді:


94

Параметр командного рядка вказує компілятору відмовитись після N помилок. Цей варіант присутній у GCC 4.6 та пізніших версіях.-fmax-errors=N

Параметр командного рядка -Wfatal-errorsвказує компілятору відмовитись після однієї помилки. Цей параметр присутній у GCC 4.0 та новіших версіях.

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


5
Я б дав +1, але для заяви про -Werror. Я вважаю, що до попереджень абсолютно слід ставитись як до помилок, оскільки більшість попереджень є вказівкою на помилковий код.
greyfade

3
@greyfade, я також вважаю, що попередження, як правило, слід розглядати як обов'язкове виправлення, але, на жаль, деякі попередження gcc можуть спрацьовувати або не залежати від рівня оптимізації, вмісту заголовків системи та будь-якої кількості інших речей, які ти не можеш легко контролювати . Таким чином, ви можете отримати всі попередження на вашій канонічній платформі (-ях) збірки, але тоді якийсь бідний шмак намагається побудувати в більш екзотичному середовищі, і це задуває.
zwol

2
@Zack, хіба для цього не потрібні заголовки -Wno-system?
Сем Міллер,

2
Аргументи, які я чув для неініціалізації змінних, на які компілятор отримує -Wuninitializedпомилкові спрацьовування, такі: він витрачає I-кеш на вказівки магазину мертвих, але не доказово мертвих; і якщо щось зміниться, що робить попередження справді позитивним, ми хочемо, щоб valgrind його вловив.
zwol

3
На жаль, лінкер не вшановує -fmax-errorsпрапор (станом на arm-none-eabi-gcc 5.4.1). Я використовував опцію, -finstrument-functionsі я отримав сотні помилок через невизначену __cyg_profile_func_enterфункцію.
lorcap

45

Ви можете використовувати параметр gcc:

-fmax-errors=5

Для цієї мети.


9
@Telthien Чому? Це здається мені відповіддю.

13
@Telthien stackoverflow.com/questions/how-to-answer говорить «будь-яка відповідь , який отримує Аскер йде в правильному напрямку , корисно» і «стислість є прийнятною». Відповіді покликані запропонувати рішення, яке іноді можна досягти одним реченням.

якщо він корисний як короткий, тоді немає причин подовжувати відповідь. Особливо не задля того, щоб бути надмірним або просити про tldr.
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), тому, якщо ви судите за кількістю помилок та попереджень, ви можете переоцінити необхідні зусилля і дати вгору.
Євген Сергєєв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.