#3170·Catch2

[clang-tidy] 静态分析器无法发现失败的 `REQUIRE` 没有通过,导致出现假阳性(例如 `bugprone-unchecked-optional-access`)

作者: BaLiKfromUA创建于 2026年7月8日更新于 2026年8月19日
标签Warnings issue

描述错误

考虑以下代码:

cpp
TEST_CASE("demo_with_optional_safe") {
  std::optional<int> opt;
  REQUIRE(opt);
  CHECK(*opt == 42); // safe: false-positive
}

TEST_CASE("demo_with_optional_unsafe") {
  std::optional<int> opt;
  CHECK(opt);
  CHECK(*opt == 42); // unsafe
}

如果我们运行clang-tidy的bugprone-unchecked-optional-access检查,该检查会在没有先前检查可选值是否包含值的情况下警告,我们将得到2个警告:

<source>:28:10: warning: unchecked access to optional value [bugprone-unchecked-optional-access]
  28 |   CHECK(*opt == 42); // safe: false-positive
      |          ^
<source>:35:10: warning: unchecked access to optional value [bugprone-unchecked-optional-access]
  35 |   CHECK(*opt == 42); // unsafe
      |          ^
2 warnings generated.
Suppressed 2 warnings (2 NOLINT).

预期行为

在"demo_with_optional_safe"中,对可选值的访问不应被标记,因为REQUIRE在失败时终止测试,从而保证在访问时opt.has_value()为真。

内容来源: catchorg/Catch2