web-dev-qa-db-ja.com

期待されるが望ましい動作ではない違いとソフトウェアのバグは何ですか

最近私はこれを尋ねました 質問numPy開発者のように聞こえる誰かが回答でコメントしたように、この動作は明らかに望ましくありません。投稿された issue はクローズされ、これは予想される動作であり、バグではないことを示しています。さらに、それを修正する計画があります。

予想されるが望まれないバグと動作の違いは何ですか?それらの用語には正確で一貫した定義がありますか?

ばかげた極端な例として、1 + 1を計算するように要求されたときにプログラムが常に3を返す場合、3を返すことは、常にそのように機能していたため、プログラムによって確かに予期される動作ですが、望ましい動作ではないので、バグです。か否か?

最近、哲学を勉強していて、この質問に興味を持ちました。

4
user2133814

wart として知られています。

Stack Overflowの元の投稿へのコメントから、

明確に言うと、これは望ましい動作ではありませんが、(歴史的な)正当な理由があります。私たち(numpy devs)は、将来のリリースで廃止する予定であり、予想どおりに機能する機能をより簡単に理解できるようにする予定です。詳細は http://github.com/numpy/numpy/pull/6256 を参照してください。 - ステファン

すべての設計決定はトレードオフどこかです。どこかでより単純なものを作り、どこかで何かがより複雑になるかもしれません。

次のJavaScriptについて考えてみましょう。

>>> '5' + 3 - 3
50
>>> '5' - 3 + 3
5

それはバグですか?いいえ。それは望ましい動作です...ええと...私は人々にそう言いたくありませんそれがそのように機能することを望みますしかし、それはあなたが 'これはどのように決定されたのか+は機能します。」

またはRuby x?2:3は構文エラーです(x ?2:3である必要があります-スペースに注意してください)。理由は?関数が?x?2:3があいまいです-変数と3項式の?部分の間のスペースで解決されます。

または、PhPで、文字列に対するPerlの auto-increment 機能を模倣することを決定しましたが、パターンの制限がないため、次のようになります。

$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";

ideone
プリントアウト:

3d8
3d9
3e0
4

そして、それほど難しいことなく、おそらく、意図されていなかった、おそらく望ましくないがそれでも期待された動作。

確かに、それが特定の方法で機能するようにするための設計上の決定は、(確かに)良い歴史的な理由がありました。そして、コードはそのように機能します-それはバグではなく、意図したとおりに機能しています。後知恵の恩恵により、これらの決定は適切ではなく、望ましくない動作につながる可能性がありますが、コードは意図したとおりに機能しています-そこにバグはなく、いぼです。

私がすぐに表示してくすぐることができるいくつかのいぼをリストしましたが、そこには無数のいぼがあります。これ以上例は必要ありません。いぼを含んでいないない言語またはライブラリを見つけたとしたら、率直に言って驚きます。

5
user40980

「バグ」とは、ソフトウェアの欠陥を表す非公式な用語です。これは通常、コードのどこかが間違っていることを示しています。正式な用語を使用する場合は、「エラー」(人間の行動または誤った結果につながる無作為)、「障害」または「欠陥」(誤ったステップ、プロセス、または定義)、および「失敗」(誤った結果)。エラーは、障害として現れる可能性のある障害または欠陥につながります。この dukeofgamingによる回答 (その質問の他の回答とともに)は、欠陥、障害、およびバグの違いをよく説明しています。

これらの用語は、ソースコード以外にも適用できます。たとえば、要件で発生したエラーは、設計の欠陥として現れる可能性があります。ユーザーがこの動作を目にした場合、テストで認識されなくても、ユーザーはそれを失敗と解釈する可能性があります。ソフトウェアコードは、要件の理解を反映している可能性がありますが、その理解は正しくありません。これはあなたの状況で起こったことに非常に似ています-ソフトウェアは開発者が意図したとおりに動作していますが、彼らの意図とユーザーの期待は一致していませんでした。

1
Thomas Owens

違いは、「バグ」はソフトウェアが何かをしていることを意味します間違った、そしてそれは現在よりもそのことをよりよく行うことができるはずです。

バグとは思わない最も望ましくない動作は、次のカテゴリのいずれかに分類されます。

  • アプリケーションの性質に固有であり、単に回避できない欠陥。携帯電話のブラウザは、セル信号が非常に弱い場合、Webページのロードに時間がかかる場合があります。また、見たくない下品な、不快な、または単に刺激的なコンテンツが表示される場合もあります。一般に、これらはブラウザが完全に解決できる問題ではありません。
  • 別の設計目標とのトレードオフ。多くのプログラミング言語では、浮動小数点数で丸め誤差が発生する可能性があります。これは、すべての計算を任意精度の計算で行うと、パフォーマンスが集中しすぎるためです。どの丸め誤差がバグとして認められるのか、そうでないのかについては多くの議論があります。
  • 何らかの理由で変更することがもはや不可能である、設計の単純な間違い。
  • プログラムが準拠する必要がある仕様の欠陥、トレードオフ、または設計エラー。ほとんどのC++コンパイラでは、明らかに破損しているコードをコンパイルできます。そうしないと、C++標準に準拠しなくなるためです。

あなたがリンクしたnumpy配列のインデックス付けの問題を完全には理解していませんが、それは3番目のカテゴリにあるようです。

1
Ixrec

バグは、誰かがどこかで間違いを犯したために発生する動作です。開発者に間違った動作を実装するように指示したのはUIデザイナーかもしれませんし、間違いを犯した開発者かもしれませんし、コンパイラかもしれません。

逆に、ボタンのアクションがあまりにも多くのコストと労力のために実装されないと決定された場合、それは確かに望ましくない動作ですが、それは意図的なものであり、バグではありません。

0
gnasher729

バグは、ユーザーが観察できる動作が文書化された動作と異なる場合です。望ましくない動作とは、ユーザーが観察可能な動作が文書化された動作に正しく対応しているが、別の動作が必要な場合です。

  • 「バグ」:システムは約束したことを実行しません
  • 「望ましくない動作」:システムは愚かな約束をする
0
Jörg W Mittag