Как запросить предупреждения GCC для C ++? - PullRequest
3 голосов
/ 25 июня 2019

GCC позволяет запрашивать доступные флаги предупреждений, специфичные для языка C ++, с синтаксисом:

g++ -Q --help=warning,c++

Добавление флагов предупреждений к вызову включает их в результат:

g++ -Wall -Q --help=warning,c++

Однако кажется, что вызов сделан с точки зрения C, и я не знаю, как это сделать с точки зрения C ++. Если вызов включает C ++ - только предупреждение, например:

g++ -Wnon-virtual-dtor -Q --help=warning,c++

вывод содержит сообщение:

cc1: warning: command line option ‘-Wnon-virtual-dtor’ is valid for C++/ObjC++ but not for C

и по-прежнему показывает предупреждение как отключенное:

  -Wnon-virtual-dtor                    [disabled]

Обратите внимание, что это происходит независимо от того, выполняется ли вызов с использованием g++ или gcc.

То же самое с C-only -Wbad-function-cast ведет себя ожидаемым образом:

gcc -Wbad-function-cast -Q --help=warning,c

Нет дополнительных сообщений и сообщений об изменениях состояния предупреждения между [disabled] и [enabled]. Опять же, независимо от того, используется g++ или gcc.

Я использую GCC версии 7.3.0. Хотя проблема, кажется, относится ко многим, если не ко всем версиям. Это можно увидеть через Compiler Explorer .

Итак, есть ли способ сделать этот запрос относительно данного языка?

1 Ответ

2 голосов
/ 26 июня 2019

Да, ваши наблюдения верны.

Возможно, это не намеченное поведение, и если вам небезразлична эта функция, я предлагаю сообщить об этом в восходящем направлении.

Обратите внимание, что это работает,однако:

touch 1.cc
g++ -Wnon-virtual-dtor -Q --help=warning,c++ 1.cc

Т.е. если есть входной файл с правильным расширением, то вызывается правильный исполняемый файл компилятора: cc1plus, а не cc1.Последний используется по умолчанию, если нет входных файлов.Я сделал небольшую отладку, и вот как это происходит:

// gcc.c:
driver::do_spec_on_infiles () const
{
  ...
  for (i = 0; (int) i < n_infiles; i++)
    {
      ...
      /* Figure out which compiler from the file's suffix.  */

      input_file_compiler
        = lookup_compiler (infiles[i].name, input_filename_length,
                           infiles[i].language);

      if (input_file_compiler)
        {
          ...
              value = do_spec (input_file_compiler->spec);

И input_file_compiler в этот момент является компилятором C, потому что

p n_infiles
$9 = 1
(gdb) p infiles[0]
$10 = {name = 0x4cbfb0 "help-dummy", language = 0x4cbfae "c", incompiler = 0x58a920, compiled = false, preprocessed = false}

Вот как был создан фиктивный файл(функция process_command в том же файле):

  if (n_infiles == 0
      && (print_subprocess_help || print_help_list || print_version))
    {
      /* Create a dummy input file, so that we can pass
         the help option on to the various sub-processes.  */
      add_infile ("help-dummy", "c");
    }
...