即使我已经涵盖了所有情况,也会收到"control reaches end of non-void function"警告

Getting "control reaches end of non-void function" warning even when I've covered all cases

本文关键字:control reaches end 警告 function non-void of 情况      更新时间:2023-10-16

为什么如果我有两个条件,而这两个条件都按原样返回函数中的正确类型,我就会收到警报。

控制到达非无效功能的末尾[-Wreturn类型]

bool EtherTrafGen::isGenerator()
{
if (multipacket) return par("destAddresses").stringValue()[0];
else if (!multipacket) return par("destAddress").stringValue()[0];
} 

纠正这种警报的方法是什么?

即使控制永远无法到达

bool EtherTrafGen::isGenerator()
{
if (multipacket) return par("destAddresses").stringValue()[0];
else if (!multipacket) return par("destAddress").stringValue()[0];
//here
} 

编译器不知道这一点(因为它是else if),并且如果达到,它会警告您潜在的未定义行为(可能另一个线程在第一次检查后修改multipacket等)。您可以添加一个默认的返回值来满足编译器的要求:

bool EtherTrafGen::isGenerator()
{
if (multipacket) return par("destAddresses").stringValue()[0];
else if (!multipacket) return par("destAddress").stringValue()[0];
return false;
}

或者只剪切整个else if,因为它是truefalse:

bool EtherTrafGen::isGenerator()
{
if (multipacket) return par("destAddresses").stringValue()[0];
return par("destAddress").stringValue()[0]; // multipacket must be false here anyway
} 

您缺少一个案例:

bool EtherTrafGen::isGenerator()
{
if (multipacket) return par("destAddresses").stringValue()[0];
else {
if (!multipacket) return par("destAddress").stringValue()[0];
else ???? <---- what should be done here
}
} 

我首先要说的是,你构建病情的方式非常奇特。你应该把它写成:

if (multipacket) doX()
else doY()

的确,编译器应该足够聪明,能够找出这种情况,而不是打印错误。

然而,您的编译器并没有那么聪明。最好不要发出警告,而不是让知道你是对的。


从更广泛的角度来看,上面的代码有可能是错误的,而不仅仅是编译器在分析中不够强大。

如果以下代码发生在多线程上下文中,您可能会遇到罕见的线程问题,在第一次访问多数据包时,您读取了一个false,从而迫使您转到第二个分支,在第二次访问时读取了true,从而强迫您在没有任何返回值的情况下退出函数。如果另一个线程在读取多数据包的两次之间对其进行修改,则可能会发生这种情况。

当然,这是一个很小的机会,因为即使多包被单独的线程更改,修改也可能不会立即在该方法中可见,因为值位于编译器引入的寄存器/缓存/其他临时位置中。

但是,为什么要冒险编写不惯用的代码手头有警告?

相关文章: