ここでは言語の種類は関係ありません。機能することができます。手続き型、命令型、オブジェクト指向... または、言語ではそうである必要はまったくありません。この質問は、未使用の変数/コードを持つことができる言語に適用されます。
このバグの種類は何ですか? 余分なものを使用していないのに、バグとみなされないのはなぜですか?
ちょっとした背景: F#ブログで読んだことがありますが、私には言語にとらわれないように思えます。結局のところ、どの言語のどのプログラムでも未使用の変数を使用できます。
ここでは言語の種類は関係ありません。機能することができます。手続き型、命令型、オブジェクト指向... または、言語ではそうである必要はまったくありません。この質問は、未使用の変数/コードを持つことができる言語に適用されます。
このバグの種類は何ですか? 余分なものを使用していないのに、バグとみなされないのはなぜですか?
ちょっとした背景: F#ブログで読んだことがありますが、私には言語にとらわれないように思えます。結局のところ、どの言語のどのプログラムでも未使用の変数を使用できます。
未使用の変数 (または未使用のパラメーター) がバグをキャッチするという警告を実際に見た場合は、次のようなものです。
start = 1
stop = 10
do_something(start, start, other_data)
stop
間違ったものを入力したため、使用されていません。幸いなことに、警告によりバグを特定できました。明らかに、そのバグをキャッチする (テストする) 他の方法があり、変数がまだ他の場所で使用されているため、この方法ではキャッチされないバグのインスタンスがあります。
一般に、未使用の変数は、作成者が実際に意図したとおりにコードが記述されていないという単なる警告です (通常、未使用の変数は必要ないため)。必ずしもバグがあるとは限りません。別の方法で書きたいと思うかもしれません。
未使用の変数が削除されるまで、未使用の変数がバグを隠す可能性がある例を次に示します。
int a[10];
int b[10]; // unused
int c[10];
// initialise a
for (i = 0; i <= 10; ++i)
a[i] = i; // out of bounds write to a when i = 10
上記の場合、 a への境界外書き込みは未使用の配列 ( b
) の先頭を上書きするため、有害な影響はありません (これは潜在的なバグとして知られています)。未使用の配列が削除されると、c
代わりにの先頭が上書きされます。
(上記の例はコンパイラに依存することに注意してくださいb
。スマート コンパイラによって が最適化されず、配列が連続して連続して割り当てられることを前提としていますが、それでも一般的な原則は有効です。)
私は 100 行を超える関数やメソッドを書いたことがないので、次のことがいつ、どのように発生するかはわかりませんが、考えられるいくつかのシナリオが含まれます。
変更されたコードが存在する可能性があります。今は役に立たない。
このような多くの変更が原因で、ただ死んでいるコードが存在する可能性があります。大規模なコード ベースではデッド コードが問題になります。プログラマーはほぼ毎回それを読まなければならず、それを微調整 (削除) することはできません。バグのコードを微調整すると、別の種類のバグが発生します。
未使用の変数は、計画または実装の欠如を示しています。最初は仕様で必要でしたが、さらに遅延したか、仕様が同じままだったため、現在はまだ使用されていません。
あまりにも早く実装されたインターフェースのようなものかもしれません。今、APIは公開されています...
環境またはビルドの種類に基づいてコードを変更できるプリプロセッサ (一種の) ディレクティブを持つ言語。多くの変数を使用できません。C# のデバッグ条件とリリース条件のように。これは、「別のビルドまたは状態のバグである可能性があります」のように、バグとしてマークできます。
それ以外は、まだ答えを探しています。