問題は、「チェック」されなかったパスについては何も表示されないことです。
つまり、実際に実行されるコードポイントのセットだけでなく、最終的に違いを報告するために実行されることが期待されるように何らかの形で「マーク」されたコードポイントのセットも探しているということです。私は非常に危険な解決策を持っているかもしれません。それはMSVC2010と2013で私のために働きます。
アプローチは静的変数のプログラム開始前の初期化を利用することですが、すべてのコードポイントが関数内にあるため、「静的アンカーポイント」を何らかの方法でそこに配置する必要があります。したがって、静的変数の初期化を遅らせるc++機能関数変数を克服する必要があります。
これは、静的メンバー変数(progloc_)を使用してテンプレートクラス(X)を介して間接参照を追加し、必要な情報(_。FILE ._"を転送するラッパー構造体であるテンプレートパラメーターごとの初期化を強制することで可能になるようです。行" _。LINE._)で。
これをまとめると、これを実現するための最も重要なコードは次のようになります。
template <class T> class X {
public:
static T progloc_;
};
template <class T> T X<T>::progloc_;
#define TRACE_CODE_POINT \
struct ProgLocation { \
public: \
std::string loc_; \
ProgLocation() : loc_(std::string(__FILE__ " at line " S__LINE__)) \
{ \
TestFw::CodePoints::Test::imHere(loc_); \
} \
}; \
TestFw::CodePoints::X<ProgLocation> dummy; \
TestFw::CodePoints::Test::iGotCalled(dummy.progloc_.loc_);
S__LINE__-ProgLocationで使用されるトリック-ctorはここからSOにあります。
#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)
追跡するには、以下を使用します。
class Test
{
private:
typedef std::set<std::string> TFuncs;
static TFuncs registeredFunctions;
static TFuncs calledFunctions;
public:
static int imHere(const std::string fileAndLine)
{
assert(registeredFunctions.find(fileAndLine) == registeredFunctions.end());
registeredFunctions.insert(fileAndLine);
return 0;
}
static void iGotCalled(const std::string fileAndLine)
{
if (calledFunctions.find(fileAndLine) == calledFunctions.end())
calledFunctions.insert(fileAndLine);
}
static void report()
{
for (TFuncs::const_iterator rfIt = registeredFunctions.begin(); rfIt != registeredFunctions.end(); ++rfIt)
if (calledFunctions.find(*rfIt) == calledFunctions.end())
std::cout << (*rfIt) << " didn't get called" << std::endl;
}
};
たぶん、このアプローチに関連する多くの問題がありますが、私はまだ見ていませんが、あなたのケースでは実用的ではありません。他の人が指摘しているように、静的コード分析ツールを使用することは、ほとんどの状況でより良い解決策です。
編集:
提供されたソリューションが以前に別のコンテキストで説明されていることがわかりました。
non-deferred-static-member-initialization-for-templates-in-gcc