Подавить нетривиально бесполезное предупреждение «управление может достигать конца не пустой функции»

Это скорее вопрос удобства, чем что-либо другое, но я хотел бы знать, могу ли я как-то подавить предупреждение:

управление может достигать конца не пустой функции [-Wreturn-type]

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

int foo(int i) {
if (i > 10) {
return i*10;
}
else {
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
}
}

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

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

Это было бы возможно портативным способом?

РЕДАКТИРОВАТЬ: Забыл добавить компилятор, который я использую,

Apple LLVM версия 8.1.0 (clang-802.0.41)

3

Решение

Компилятор не может понять, что Exception::throwExcept() не вернется. Здесь есть два решения. Один из них — сообщить компилятору, что

struct Exception
{
[[noreturn]] static void throwExcept(SomeType const&);
};

(лязг-х -Wmissing-noreturn, который входит в -Weverything, предупредит, если вышеуказанная функция может быть объявлена [[noreturn]] но не) или переставить функцию как

int foo(int i) {
if (!(i>10))
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));

return i*10;
}
10

Другие решения

Маркировка Exception::throwExcept функция [[noreturn]] должен помочь компилятору выяснить, что он на самом деле не вернется.

7

Быстрый и грязный способ устранить ошибку — использовать оператор запятой в операторе возврата. Если вы используете

return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0;

Компилятор увидит оператор return, но фактически никогда не выполнится как

Exception::throwExcept(MyCustomException("Error: i not in the accepted range"))

Скинет прежде, чем сможет вернуть 0.

2

Мне кажется, что ваш компилятор не может видеть внутри Exception::throwExcept знать, что это всегда выбрасывает исключение.

Помогите компилятору с необработанным исключением C ++ throw как последняя строка вашей функции: throw std::exception("Just to help the compiler know to not warn here"); Это не повредит производительности, так как код никогда не будет выполнен.

1