Ошибка GCC: функция может быть кандидатом на атрибут "pure", если известно, что она нормально возвращает
Учитывая этот код:
#include <cstdlib>
void func(int x)
{
if (x)
abort();
};
g++ -Werror=suggest-attribute=pure
жалуется:
ошибка: функция может быть кандидатом в атрибут "pure", если известно, что она нормально возвращается
Мне это кажется странным - разве не очевидно, что функция, как известно, не возвращает нормально? Есть ли способ сказать GCC, что он не всегда возвращается нормально, или что я не хочу, чтобы это предупреждение появлялось для этой конкретной функции?
1 ответ
Это похоже на ошибку в 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)
^