一般的にこれを行うには、すべての制御パスに沿った値のシンボリック分析と、条件が真かどうかを判断するためのブール シンボリック単純化が必要です。例えば:
void bar(...a) {
...
x=2*a;
if (...) x=17;
foo(x)
...
}
void foo(int x) {
if (x<a && !x>5) { // dead code if called from bar ...
...
デッド コード行が実際にデッドであることを確認するには、foo へのすべての呼び出しを見つけて、それぞれがこの状態を引き起こすことを確認する必要があります。したがって、グローバル関数ポインター分析が必要なグローバルコールグラフが必要であり、グローバルおよびローカルポイントツー分析が必要です...
これを行う既製のツールは知りません。
プログラム変換システムを使用して、ある程度の労力をかけて構築できます。私たちのDMS ソフトウェア リエンジニアリング ツールキットには、C で使用できる前述の機構がすべて含まれています。このすべての機構はまだ C# で使用できるわけではありませんが、言語にとらわれない方法で実装されているため、C# に到達するのは大変ですが、実用的ではありません。