bugprone-return-const-ref-from-parameter

检测返回语句将常量引用参数作为常量引用返回的情况。 如果调用方使用 xvalues 作为参数,这可能会导致使用后释放错误。

在 C++ 中,常量引用参数可以接受 xvalues,这些 xvalues 将在调用后被析构。 当函数也以常量引用形式返回此类参数时,返回的引用可以在它引用的对象被销毁后使用。

可以通过声明一个有问题的函数的重载来解决这个问题,其中 const & 参数被声明为 &&。 开发人员必须确保该函数的实现不会产生使用后释放错误,这正是此检查警告的错误。 将此类 && 重载标记为 deleted,也会消除警告。 在返回不同 const & 参数取决于函数的控制流的情况下,所有有问题的 const & 参数都被声明为 && 的重载将解决此问题。

示例

struct S {
  int v;
  S(int);
  ~S();
};

const S &fn(const S &a) {
  return a;
}

const S& s = fn(S{1});
s.v; // use after free