相当令人尴尬的是,我写了类似以下内容(已消毒):
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
,但这不适用于此。
答案 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会发出警告,(即使未使用Wall
和Wextra
标志):
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中自行查看。