Отключение предложений «Вы имели в виду ...» в GCC - PullRequest
0 голосов
/ 06 ноября 2019

Более новые версии GCC идут с тем, что я считаю раздражающей ошибкой: они пытаются угадать меня, испуская бесполезное "вы имели в виду?"предложения, которые заглушают другие предупреждения.

Например:

$ gcc -Wall -c -o /dev/null -xc - <<'EOT'
#include <stdlib.h>

void foo(char *b, size_t z){ readlink("/foo", b, z); }
EOT
<stdin>: In function ‘foo’:
<stdin>:3:30: warning: implicit declaration of function ‘readlink’;
did you mean ‘realloc’? [-Wimplicit-function-declaration]

Нет, я не имел в виду realloc;Я просто забыл включить заголовок unistd.h.

Есть ли способ отключить это?

Я хочу, чтобы он печатался просто implicit declaration of function ‘readlink’ [-Wimplicit-function-declaration], без полезного предложения.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Оказывается, это просто жестко запрограммировано, и нет способов отключить это.

Из источника gcc :

3328       warned = warning_at
3329         (&richloc, OPT_Wimplicit_function_declaration,
3330          G_("implicit declaration of function %qE; did you mean %qs?"),
3331          id, suggestion);

[И нет, ни lookup_name_fuzzy(), ни hint.suggestion () не будут принимать во внимание ни один параметр командной строки при возврате своих результатов]

Фильтрация вывода ошибок с помощью некоторого колдовства оболочки, например. с

{ gcc ... 2>&1 >&3 | sed 's/; did you mean [^?]*[?]//' >&2; } 3>&1

на самом деле не является решением, во-первых, потому что его нельзя использовать в make-файлах (состояние ошибки командной строки будет равно sed или какому-либо фильтру, а не gcc),и во-вторых, потому что это все равно будет содержать такие вещи, как:

 void foo(char *b, size_t z){ readlink("/foo", b, z); }
                              ^~~~~~~~
                              realloc

, для фильтрации которого потребуется сложная логика.

[использование bash / kshisms, как 2> >(...), не поможетлибо 1-й пункт, потому что make будет использовать /bin/sh, а не оболочку пользователя]

1 голос
/ 06 ноября 2019

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

gcc main.c 2>&1 | sed -E "s/; did you mean .*\?//"

. Здесь я перенаправляю stderr (там, где напечатаны предупреждения) на stdout с 2>&1, а затем ясделал простой скрипт замены, который удаляет эту фразу.

Это добавляет сложности, и вы теряете цвета, но делаете то, что просили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...