即使我已经涵盖了所有情况,也会收到"control reaches end of non-void function"警告
Getting "control reaches end of non-void function" warning even when I've covered all cases
为什么如果我有两个条件,而这两个条件都按原样返回函数中的正确类型,我就会收到警报。
控制到达非无效功能的末尾[-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
,因为它是true
或false
:
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,从而强迫您在没有任何返回值的情况下退出函数。如果另一个线程在读取多数据包的两次之间对其进行修改,则可能会发生这种情况。
当然,这是一个很小的机会,因为即使多包被单独的线程更改,修改也可能不会立即在该方法中可见,因为值位于编译器引入的寄存器/缓存/其他临时位置中。
但是,为什么要冒险和编写不惯用的代码,手头有警告?
相关文章:
- 方法错误"not all control paths return a value"和方法不返回值
- Spin Control GetPos()值被延迟
- 警告:"Not all control paths return a value" c++
- 抑制非平凡无用的警告"control may reach end of non-void function"
- 我什么时候不希望在Visual Studio中启用“Control Flow Guard Microsoft
- Vim 如何"take control"终端并允许将其用作可修改的缓冲区?
- "Control reaches end on non-void function" with do { return result; } while(condition);
- 我在C++年写了一个findClosestPrime(),但Xcode抱怨"Control may reach end of non-void function"
- 收到此警告" Control may reach end of non-void function "
- MFC Rich Edit Control 2.0接收到单击事件
- 即使我已经涵盖了所有情况,也会收到"control reaches end of non-void function"警告
- 布尔函数"Control reaches end of non-void function"错误
- CUDA : 错误: 创建推力时"transfer of control bypasses initialization of"::d evice_ptr
- 更改Internet Explorer安全设置(initaize和Script ActiveX Control in n
- 当调用带有警告"control reaches end of non-void function"的函数时,(实际上)会发生什么?
- 为什么'control reaches end of non-void function'只是一个警告?合法吗?
- "control reaches end of non-void function",通过枚举类型进行完全处理的案例切换
- "control reaches end of non-void function" Eclipse C++ 中的警告,但没有编译或运行时错误
- if-else 块引发"control reaches end of non-void function"警告
- 看不到"control reaches end of non-void function [-Wreturn-type]"的原因