ソフトウェア技術者のためのバグ百科事典(11)「数値演算」のバグは奥が深い山浦恒央の“くみこみ”な話(132)(3/3 ページ)

» 2020年08月17日 10時00分 公開
前のページへ 1|2|3       
※本記事はアフィリエイトプログラムによる収益を得ています

4.バグの兆候

4.1 演算誤差が発生する

 演算誤差の原因を見つけることは非常に困難です。手掛かりは、途中までは何事もなかった演算結果が突然発散したり、有効数字を極端に失ったりした場合は、演算誤差を疑いましょう。

4.2 オーバーフローとゼロ除算

 ログから演算結果を追いましょう。変数の値が「Inf」や0に戻る場合は、オーバーフローを疑い、「NaN」となる場合は、ゼロ除算の可能性があります。また、環境によっては動作が停止するため、参考にしてください。

4.3 演算ルールを間違える

 実行結果が正しく出ず、計算ロジックが間違っているかもしれないと考えた場合は、「式が正しいか」「符号ミスをしていないか」「演算順序が正しいか」などの演算ルールに着目しましょう。

5.対策

5.1 演算誤差

 演算誤差は、事前に対策を立てることが難しいと思いますが、以下に気を付けましょう。

  • 事前にどの程度の精度を持っているか把握する
  • 大きめの型を使用する
  • 計算式を工夫し、桁落ち、情報落ちが発生しにくい計算式に変更する

5.2 オーバーフロー、ゼロ除算

5.2.1 オーバーフロー

 仕様や設計の段階で、おおよその最大値・最小値が分かるはずです。その情報から、オーバーフローを起こしそうな演算処理があるか確認しましょう。また、時間があれば、最大値・最小値を入れるテストを行ってください。

5.2.2 ゼロ除算

 計算式に除算がある場合、ゼロ除算を回避する条件式を追加しましょう。また、静的解析ツールなどを活用し、問題がないか確認することも大事です。

5.3 演算ルールを間違える

 まずは、仕様の数式を読み解き、意図を確認しましょう。これが意外に難しく、演算ルールを理解する必要があります。分からない場合は、仕様定義者に意図を確認しましょう。

6.まとめ

 今回は、四則演算に関するバグ(演算誤差、オーバーフロー、演算ルール)を取り上げました。

  • 演算誤差のバグは、演算によって発生する誤差が蓄積して発生します。このバグは、何事もなく進んでいた出力結果が突然発散する場合は要注意です。言語の演算精度を理解し、誤差が発生しない計算式に変更して対処しましょう
  • オーバーフローは、取り得る値の範囲を超えてしまった場合に発生します。仕様や設計書から考え得る最大値・最小値を把握し、オーバーフローが発生しないか確認しましょう
  • ゼロ除算は、式をゼロで割ってしまう場合に発生します。このバグの発生時は、NaN(Not a Number)やプログラムの動作が停止することがあり、注意しましょう。対策案としては、除算の場所でゼロ割り算が発生し得るかを確認することです
  • 演算ルールの間違いは、式や優先順位、数学的なルールを見落としている場合に発生します。演算結果が意図したものと異なる場合、演算の意図を確認しましょう。対策方法は、仕様定義者にヒアリングしながら、意図を理解することです

7.終わりに

 今回は、四則演算に関するバグを取り上げました。四則演算はプログラミングの基本ですが、意外と発生するバグだと筆者は感じています。特に、オーバーフローやゼロ除算は、クリティカルなバグとなります。気を付けましょう。

 また、オーバーフローやゼロ除算は、前シリーズのバグ検出ドリルや書籍版バグ検出ドリルにも問題として登場します。興味がある方は、目を通していただければと思います。

参考文献

[1]コンピュータのしくみがよくわかる!C言語プログラミングなるほど実験室(矢沢久雄、2015年、技術評論社)

[2]すべてわかるIoT大全2017(吉田琢也、2017年、日経BP)

[3]数値計算の常識(伊理正夫、藤野和建、1985年、共立出版)

山浦先生執筆の書籍「ソフトウェア技術者のためのバグ検出ドリル」が発売中!

 山浦恒央先生が執筆した書籍「ソフトウェア技術者のためのバグ検出ドリル」が日科技連出版から発売中です。本連載「山浦恒央の“くみこみ”な話」とTechFactoryの連載「組み込みエンジニアの現場力養成演習ドリル」をベースに、大幅加筆、改訂した内容になっています。

 内容は、「デバッグの詰将棋」で、要求仕様定義、設計、コーディング、テスト、保守の5フェーズでの「バグを埋め込んだ仕様記述やソースコード」を読んで、バグをピンポイントで見つける問題集になっています。全部で31問あり、難易度は初級から上級まで、いろいろです。興味のある方は、Amazon.comや書店でチェックしてください!

【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.