用于捕获未分配的r值的编译器选项

时间:2017-08-23 08:32:31

标签: c++ gcc return-value compiler-warnings

相当令人尴尬的是,我写了类似以下内容(已消毒):

vector_item next()
{
    if (this->it == this->myVector.end()){
        this->it == this->myVector.begin();
    }
    return *(this->it++);
}

明显的错误很明显。然而,它确实需要一段时间才能追踪。

没有为此生成编译器警告,但是应该有吗?这里有一个未使用的r值(而不是说,一个函数的未使用的返回值被调用它的副作用),这在我看来是一个指示代码有问题。

g++ -Wall -Wextra一起编译。 (GCC 4.8.3)

我知道-Wunused-result,但这不适用于此。

2 个答案:

答案 0 :(得分:6)

  

没有为此生成编译器警告,但是应该有吗?

我无法想到我在标准中读过的任何需要警告的内容。

但是,clang开发团队似乎认为它需要一个:

18 : <source>:18:18: warning: equality comparison result unused [-Wunused-comparison]
        this->it == this->myVector.begin();
        ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
18 : <source>:18:18: note: use '=' to turn this equality comparison into an assignment
        this->it == this->myVector.begin();
                 ^~
                 =
1 warning generated.

我的第一个想法是它是gcc中的QoI问题。可能值得提出它作为一个问题。

我很幸运,因为我们的软件是针对mac(clang),linux(gcc)和windows(msvc)编译的,因此可以及早发现标准侵权和边缘案例。

可能会想到在另一个编译器上重新编译代码,然后再次进行错误搜索 - 这对我很有帮助。

答案 1 :(得分:4)

  

没有为此生成编译器警告,但是应该有吗?

标准中没有任何声明可以让GCC为该案例生成警告。

您可以将begin()标记为WARN_UNUSED,在此处首先定义:

#define WARN_UNUSED __attribute__((warn_unused_result))

here所描述的那样,但这当然不是你想要的,但它是一些东西。我无法找到GCC的任何选项来为您生成警告。

这是一个众所周知的GCC bug但是hasn't implemented您正在寻找的功能,至少要到2017-07-21。

但是,clang 6.0.0会发出警告,(即使未使用WallWextra标志):

prog.cc:11:18: warning: equality comparison result unused [-Wunused-comparison]
        this->it == this->myVector.begin();
        ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:11:18: note: use '=' to turn this equality comparison into an assignment
        this->it == this->myVector.begin();
                 ^~
                 =
1 warning generated.

此外,zapcc 1.0.1也会发出警告(即使没有警告标志):

/home/jail/prog.cc:11:18: warning: equality comparison result unused [-Wunused-comparison]
        this->it == this->myVector.begin();
        ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/home/jail/prog.cc:11:18: note: use '=' to turn this equality comparison into an assignment
        this->it == this->myVector.begin();
                 ^~
                 =
1 warning generated.

如果您愿意,可以在Wandbox中自行查看。