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



相当尴尬的是,我写了如下内容(消毒(:

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

明显的错误是显而易见的。然而,追踪确实花了很短的时间。

没有为此生成编译器警告,但应该生成吗?这里创建了一个未使用的 r 值(而不是说,一个未使用的返回值来自因其副作用而被调用的函数(,在我看来,这似乎表明代码有问题。

g++ -Wall -Wextra编译。(海合会 4.8.3(

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

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

我想不出我在标准中读到的任何内容都需要在这里发出警告。

然而,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(编译的,因此可以及早发现标准侵权和边缘情况。

在不时地进行错误搜索之前,在另一个编译器上重新编译您的代码可能是一个想法 - 它对我有帮助。

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

标准中没有任何声明应该使GCC为这种情况生成警告。

你可以扩展begin(),通过将其标记为WARN_UNUSED,首先你可以定义:

#define WARN_UNUSED __attribute__((warn_unused_result))

如此处所述,但这当然不是您要找的,但它是一些东西。我找不到任何 GCC 选项来在您的情况下生成警告。

这是一个已知的 GCC 错误,但至少在 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中自己查看。

相关内容

  • 没有找到相关文章

最新更新