Ошибка GCC: функция может быть кандидатом на атрибут "pure", если известно, что она нормально возвращает

Учитывая этот код:

#include <cstdlib>

void func(int x)
{
  if (x)
    abort();
};

g++ -Werror=suggest-attribute=pure жалуется:

ошибка: функция может быть кандидатом в атрибут "pure", если известно, что она нормально возвращается

Мне это кажется странным - разве не очевидно, что функция, как известно, не возвращает нормально? Есть ли способ сказать GCC, что он не всегда возвращается нормально, или что я не хочу, чтобы это предупреждение появлялось для этой конкретной функции?

Демо: https://godbolt.org/g/720VOT

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)
      ^
Другие вопросы по тегам