2

鉴于此代码:

#include <cstdlib>

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

g++ -Werror=suggest-attribute=pure抱怨:

错误:如果已知函数正常返回,则函数可能是属性“纯”的候选者

这对我来说似乎很奇怪——不是很明显该函数不知道正常返回吗?有没有办法告诉 GCC 它并不总是正常返回,或者我不希望这个警告出现在这个特定的功能上?

演示:https ://godbolt.org/g/720VOT

4

1 回答 1

1

这似乎是 gcc 中的一个错误(或者至少是文档和实际实现的差异)。文档内容-Wsuggest-attribute=pure如下:

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

警告可能是属性候选的函数pureconstnoreturn。编译器仅对在其他编译单元中可见的函数或(在 and 的情况下pureconst无法证明该函数正常返回时发出警告。一个函数如果不包含无限循环则正常返回或通过抛出、调用abort或捕获异常返回。此分析需要 option -fipa-pure-const,默认情况下在 at-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)
      ^
于 2017-01-18T07:49:13.840 回答