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

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

#include <cstdlib>

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

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

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

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

Демо-версия: https://godbolt.org/g/720VOT

2

Решение

Это похоже на ошибку в 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)
^
1

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

Других решений пока нет …

По вопросам рекламы [email protected]