【问题标题】:Is casting a function return to void an "old-style-cast" or not?将函数转换为 void 是否是“旧式转换”?
【发布时间】: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) );

然而,gccclang 似乎都能够毫无怨言地编译这段代码(first 形式)。所以我想我的问题的最终形式是:就 C 风格的转换而言,将函数返回到 void 是否被视为规则的例外?还是我需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?

【问题讨论】:

  • MSVC 编译器为 (void) 转换发出分析器警告,因为它是“C 样式转换”。使用 static_cast 时我没有收到该警告。
  • 切向:您可以#define IGNORE_RET(func) static_cast&lt;void&gt;(func) 然后让IGNORE_RET(Foo.Append(bar)); 自我记录您故意忽略退货。
  • @NathanOliver 我正在考虑类似的事情。我们确实有一个名为 UNUSED 的宏,但它的主要用途是未使用的函数参数,我担心如果我使用它,未来的一些“优化”会改进它,所以它不会评估它的参数......所以我回避了它。正如您所建议的,一个更明确命名的宏可能是最好的解决方案
  • @WernerHenze 感谢您提供的信息。您使用的是哪个版本的 MSVC?我没有看到这个警告
  • @TimRandall 我刚刚再次测试以确认并看到使用 VS15.9.2 的警告。由于这是一个代码分析警告,仅编译代码是不够的,您还必须启用代码分析并将规则集设置为“Microsoft 所有规则”。

标签: c++ casting suppress-warnings


【解决方案1】:

没关系。

(void) f(x);

根据[expr.static.cast]/6,始终等同于static_cast

任何表达式都可以显式转换为 cv void 类型,在这种情况下,它就变成了废弃值表达式。

将函数的结果转换为void使表达式成为discard-value-expression 的方法。现在,C++ 方式应该是static_cast&lt;void&gt;(...),但(void) ... 是一个成语(而且更短)。

由于后者定义明确并且在代码库中非常常见,gcc1 和 clang2 使它触发Wold-style-cast

它定义明确,被主要编译器认可。没关系。


1)g++ documentation --- 3.5 Options Controlling C++ Dialect

-Wold-style-cast(仅限 C++ 和 Objective-C++)
如果在 C++ 程序中使用旧样式(C 样式)强制转换为非 void 类型,则发出警告。新型演员表(dynamic_caststatic_castreinterpret_castconst_cast)不易受到意外影响,并且更容易搜索。

2)not documented

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2017-12-06
    • 2011-02-24
    • 2011-06-17
    • 2017-02-23
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多