1

-O3次の最小限っぽいプログラムは、およびおそらく を使用してコンパイルすると segfault が発生しますが、 (clang 4.0 を使用すると) で-O2正常に実行されます。-O0

#include <iostream>

class A {
public:
  virtual void me() const { std::cerr << "hi!\n"; }
};

class B {
public:
  B(const A& a_) : a(a_) {}
  virtual void me() const { a.me(); }

private:
  const A& a;
};

class C {
public:
  C(const B& b_) : b(b_) {}
  void me() const { b.me(); }

public:
  const B& b;
};

int main() {
  C c = C(A());
  c.me();
}

その理由は、一時オブジェクトから構築されたc.bクラスの一時オブジェクトへの参照で初期化されるためです。コンストラクターが終了すると、一時的なものはなくなりますが、それへの参照は に残ります。BAc.C()Bc.b

orの実装を制御できない場合、この状況を回避するためにどのような良い方法を採用できますBA? この状態を検出できる静的アナライザーはありますか? (私のバージョンのscan-buildでは問題が見つかりませんでした。)

関連:一時ファイルへのダングリング参照を検出する

4

2 に答える 2