web-dev-qa-db-ja.com

論理エラーは常に、最初のプログラム状態のコード行が間違っていることが原因で発生しますか?

致命的なランタイムエラーとは対照的に、論理エラーは、プログラムを致命的に終了させないが、意図しないことを行うランタイムエラーです。

論理エラーは、間違っている最も早い状態のコード行によって必然的に引き起こされますか?

または、論理エラーは、最初の間違った状態の行の前のコード行によって引き起こされる可能性がありますか?

私の質問は主に

  • デバッグは、プログラムの状態が正しいか間違っているかを判断するのに役立つだけであり、それを超えることはできないと思います。

  • デバッグすることで、論理エラーの原因となるコード行を見つけることができると思います。論理エラーは常に、の行の前にあるコード行ではなく、間違っている最も早い状態のコード行によって引き起こされると思うからです。間違っている最も早い状態のコード。

プログラムの状態を追跡するためにデバッガーを使用して原因を見つけることができない論理エラーの例を提供すると、私は間違っています。言い換えれば、原因が間違っているプログラムの初期の状態よりも早い論理エラーの例を提供できますか?

1
Tim

あなたの言葉遣いによって、あなたはあなたの答えが真実であると定義しました。

あなたは最初の「間違った状態」について話します。何が間違った状態を定義しますか?何が悪いのですか?通常、答えは「正しい状態ではなかった」です。定義上、最初の間違った状態の前には正しい状態のみがあります(または、最初のステップで問題が発生しましたが、それがOSの問題になり始めています)。したがって、正しい状態から間違った状態への遷移があります。

状態を変更できるのはステートメント(コード行)だけであると仮定すると、定義上、完了したばかりで最初の間違った状態になったステートメントは「問題」です。

これらの仮定は常に有効であるとは限りません。たとえば、あるプログラムが別のプログラムのメモリ空間に値をプッシュできる「メモリトレーナー」を使用する場合、このトレーナーによって引き起こされるエラーは、明らかにコード行によって引き起こされるものではないことを示すのは簡単です。

また、問題を「引き起こしている」行が1つもない場合もあります。そのような例の1つは、マルチスレッドのレースケースです。このような場合、問題は実際には2つのスレッド間の相互作用が原因で「間違った状態」が発生するため、どのスレッドが問題を「引き起こした」かを特定できるとは限りません。ステートメント(コード行)はスレッドで実行され、エラーは「スレッド上」ではないため、コード行に問題はありません。

より「建設的な」アプローチは、言い回しを変更することかもしれません。 「エラーの原因となった行」ではなく、「エラーを修正するために変更する必要のある行」について考えてください。その言葉遣いは、非難ゲームを回避するのに十分なだけ物事を変えます。

これは、メモリのバグに対処するためにも非常に重要です。これらのバグの場合、実際の最初の「間違った状態」を特定することは非常に難しいことがよくありますが、セグメンテーション違反の状態を特定することは簡単です。セグメンテーション違反が最初の「間違った状態」であると推測し、実際の根本原因を探すのを忘れているため、エラーがセグメンテーション違反の近くのコード行である必要があると誤って推測するのは簡単です。

10
Cort Ammon

混乱させるために、プログラムから重要なコード行を削除すると、誤動作します。

これを実行すると、コードの論理エラーはプログラムのany行になりません。線がないことが原因です。

7
Simon B

これを考慮してください:不十分または時期尚早のアルゴリズム。つまり、このアルゴリズムが実行されると、有効な状態のサブセットのみが通過し、いくつかの有効な状態が残ります未訪問。そうすることで、それは正しい答えを逃します。したがって、アルゴリズムが終了すると、正しい状態とは異なる状態(*)で終了します。

(*)戻り値は状態の一部と見なされます。

例:整数配列内の特定の整数値を検索しようとするアルゴリズム。

アルゴリズムには欠陥が含まれているため、偶数のインデックス値にあるアイテムのみが検索されます。奇数のインデックス値のアイテムは訪問されません。

偶数インデックスの要素の訪問は、有効な状態で構成されます。ただし、奇数のインデックスの要素にアクセスできないことは、誤った結果につながる省略です。

論理エラーは誤った状態にありますtransitionsこれによりインデックスがスキップされます。


デバッガーユーザーはプログラムの実行をステップスルーできるため、ユーザーは、入力されている誤った状態と、正しくない状態遷移の両方を確認できます。したがって、上記のエラーはデバッガーを使用してキャッチできます。

ただし、(タスクに適さないアルゴリズムを使用した)重要なアルゴリズムの不備の場合、論理エラーは、(1)コードに実装されているアルゴリズムを知っている人、および(2)それを知っている人だけが見ることができます。実装はプログラムの要件を満たしません。これは、コードの行が書き込まれる前に、紙の上で「デバッグ」が行われる場合です。

2
rwong