2017-01-18 6 views
2

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

#include <cstdlib> 

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

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

error: function might be candidate for attribute ‘pure’ if it is known to return normally

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

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

+1

функция не имеет никакого эффекта, но возвращаемое значение (т.е. это _no effect_ для себя), и это значение зависит (только) от параметров. Это хороший кандидат. Почему нет? – skypjack

+0

@skypjack: функция имеет побочный эффект - она ​​может вызывать 'abort()', тем самым заканчивая программу. Я утверждаю, что это не кандидат на «чистую» оптимизацию. Вы думаете иначе? –

+1

О, вы ожидаете, что компилятор будет _know_, это 'abort'. Итак, представьте, что вы используете указатель на функцию, которой вы назначили 'abort', будет ли ваше ожидание одинаковым? Я не думаю, что он проверяет функцию, она просто принимает ее как вызываемый тип 'void (void)', который не влияет на возвращаемое значение. Последнее, таким образом, зависит только от параметров, а функция «чиста». – skypjack

ответ

1

Это похоже на ошибку в НКУ (или, по крайней мере, несоответствие документации и фактической реализации). documentation on -Wsuggest-attribute=pure гласит:

-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn

Warn about functions that might be candidates for attributes pure , const or noreturn . The compiler only warns for functions visible in other compilation units or (in the case of pure and const) if it cannot prove that the function returns normally. A function returns normally if it doesn't contain an infinite loop or return abnormally by throwing, calling abort or trapping. This analysis requires option -fipa-pure-const , which is enabled by default at -O and higher. Higher optimization levels improve the accuracy of the analysis.

Однако фактический анализ, кажется, игнорирует возможность невозврата вызовов, хотя он уважает возможные исключения:

$ 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) 
    ^
+0

Я бы не назвал это _bug_, а недостаток точности во время анализа. Это означает, что «если он, как известно, нормально возвращается», который должен сказать нам, что компилятор не смог доказать некоторые свойства функции, но все же испускает предупреждение, надеясь на лучшее. Функции Noreturn довольно часты, поэтому я предлагаю подать PR в [GCC BZ] (https://gcc.gnu.org/bugzilla/) об этом. – yugr