【发布时间】:2023-04-03 14:55:01
【问题描述】:
Coverity 抱怨我们代码库中的各种函数调用都没有检查返回值。
未检查的返回值 (CHECKED_RETURN)3。 check_return:调用追加 不检查返回值(如其他地方所做的 73 出 78 次)。
过去,我们可以通过将返回值强制转换为 void(如 here 所讨论的那样)简单地解决此问题(在仔细检查返回值是否真的不重要之后):
(void)Foo.Append(bar);
但是,我们正朝着启用所有警告的方向发展,并且将警告视为错误,所以我有点担心上面的代码会生成old-style-cast 诊断。如果是这种情况,我需要将我们的代码修改为更丑陋的格式:
static_cast<void>( Foo.Append(bar) );
然而,gcc 和 clang 似乎都能够毫无怨言地编译这段代码(first 形式)。所以我想我的问题的最终形式是:就 C 风格的转换而言,将函数返回到 void 是否被视为规则的例外?还是我需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?
【问题讨论】:
-
MSVC 编译器为
(void)转换发出分析器警告,因为它是“C 样式转换”。使用static_cast时我没有收到该警告。 -
切向:您可以
#define IGNORE_RET(func) static_cast<void>(func)然后让IGNORE_RET(Foo.Append(bar));自我记录您故意忽略退货。 -
@NathanOliver 我正在考虑类似的事情。我们确实有一个名为 UNUSED 的宏,但它的主要用途是未使用的函数参数,我担心如果我使用它,未来的一些“优化”会改进它,所以它不会评估它的参数......所以我回避了它。正如您所建议的,一个更明确命名的宏可能是最好的解决方案
-
@WernerHenze 感谢您提供的信息。您使用的是哪个版本的 MSVC?我没有看到这个警告
-
@TimRandall 我刚刚再次测试以确认并看到使用 VS15.9.2 的警告。由于这是一个代码分析警告,仅编译代码是不够的,您还必须启用代码分析并将规则集设置为“Microsoft 所有规则”。
标签: c++ casting suppress-warnings