Учитывая этот код:
#include <cstdlib>
void func(int x)
{
if (x)
abort();
};
g++ -Werror=suggest-attribute=pure
жалуется:
ошибка: функция может быть кандидатом на атрибут «pure», если известно, что она нормально возвращает
Мне это кажется странным — разве не очевидно, что функция, как известно, не возвращает нормально? Есть ли способ сказать GCC, что он не всегда возвращается нормально, или что я не хочу, чтобы это предупреждение появлялось для этой конкретной функции?
Демо-версия: https://godbolt.org/g/720VOT
Это похоже на ошибку в gcc (или, по крайней мере, несоответствие документации и фактической реализации). документация по -Wsuggest-attribute=pure
гласит:
-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn
Предупреждать о функциях, которые могут быть кандидатами в атрибуты
pure
,
const
или жеnoreturn
, Компилятор только предупреждает о видимых функциях
в других единицах компиляции или (в случаеpure
а такжеconst
) если оно
не может доказать, что функция возвращает нормально. Функция возвращает
как правило, если он не содержит бесконечный цикл или ненормальный возврат
бросать, звонитьabort
или ловушка. Этот анализ требует опции
-fipa-pure-const
, который включен по умолчанию в-O
и выше.
Более высокие уровни оптимизации повышают точность анализа.
Тем не менее, фактический анализ, кажется, игнорирует возможность невозврата вызовов, хотя и учитывает возможные исключения:
$ cat test-noreturn.cpp
[[noreturn]] void foo();
void func(int x)
{
if (x)
foo();
}
$ g++ -std=c++11 -c -O -Wsuggest-attribute=pure test-noreturn.cpp
$ cat test-noreturn-nothrow.cpp
[[noreturn]] void foo() throw();
// ^^^^^^^
void func(int x)
{
if (x)
foo();
}
$ g++ -std=c++11 -c -O -Wsuggest-attribute=pure test-noreturn-nothrow.cpp
test-noreturn-nothrow.cpp: In function ‘void func(int)’:
test-noreturn-nothrow.cpp:4:6: warning: function might be candidate for attribute ‘pure’ if it is known to return normally [-Wsuggest-attribute=pure]
void func(int x)
^
Других решений пока нет …