Как заставить Qt Creator показывать ошибку при отсутствии возврата - PullRequest
1 голос
/ 07 августа 2011

Оказывается, что компилятор g ++ (используемый в Qt Creator по умолчанию) выдает простое предупреждение, если у вас нет оператора return в функции non-void, то есть:

int* create_array(int n)
{
    int* a = new int[n];
}

компилируется нормально.

Это поведение подвержено бесчисленным сообщениям об ошибках на самом g ++, но похоже, что разработчики считают, что это поведение соответствует стандарту C ++ (который является дискуссионным, поскольку в этой части это немного запутанно), как указано в http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43943:

Flowing off the end of a function is equivalent to a return with no value; 
this results in undefined behavior in a value-returning function.

Однако, тот же самый абзац начинается с:

  A return statement without an expression can be used only in functions 
  that do not return a value, that is, a function with the return type void,
  a constructor (12.1), or a destructor (12.4).

Так что кроме этих (не) священных войн за стандартную интерпретацию есть какие-либо варианты сделать флаг Qtэто как ошибка во время компиляции?

Ответы [ 2 ]

1 голос
/ 16 марта 2017

Синтаксис -Werror=warning_name можно использовать для обработки определенного предупреждения как ошибки. В вашем случае вы можете использовать -Werror=return-type (где return-type - это имя предупреждения «конец элемента управления недействительной функции»). Согласно https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html.

1 голос
/ 07 августа 2011

Это относится не к Qt, а к g ++.

В опциях сборки просто добавьте флаг -Werror, и g ++ будет рассматривать любое предупреждение как ошибку.Вам также может понадобиться использовать флаг -Wall, чтобы g ++ генерировал дополнительные предупреждения, поскольку он по умолчанию не генерирует предупреждения для пропущенных операторов возврата (и многих других ситуаций).Однако нет способа настроить этот параметр для каждого предупреждения, так что это либо все, либо ничего.

...