ソフトウェア技術者のためのバグ百科事典(11)「数値演算」のバグは奥が深い:山浦恒央の“くみこみ”な話(132)(3/3 ページ)
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第11回は、意外と奥が深い、数値演算のバグを取り上げます。
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や書店でチェックしてください!
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- ソフトウェア技術者のためのバグ百科事典(10)デバッグの強力な手掛かり「ログ」のバグ
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第10回は、デバッグの強力な手掛かりとなる「ログ」にまつわるバグを取り上げます。 - ソフトウェア技術者のためのバグ百科事典(9)境界値のバグ
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第9回は、常連バグの代表格である、境界値に関する仕様の不良や勘違いのバグ「境界値のバグ」を取り上げます。 - ソフトウェア技術者のためのバグ百科事典(8)バグを見つけるテストがバグってる
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第7回は、プログラムのバグを見つける作業である「テスト」がテーマです。テストの作業次第では逆にバグを作り込むこともあり、「テストのテストのテスト」のように無限ループに陥りかねません。 - ソフトウェア技術者のためのバグ百科事典(7)要求仕様書がバグってる
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第7回は、ソフトウェアのライフサイクルで最も重要な要求仕様に焦点を当てます。要求仕様書をしっかり作成しないと、その後のフェーズでさまざまな問題が発生し、プロジェクトの進行に大きく影響するのです。 - ソフトウェア技術者のためのバグ百科事典(6)不信感を生む“文書作成のバグ”
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第6回は、ソフトウェア開発業務の中で圧倒的に大きな比率を占める「文書作成」における間違い、「文書作成のバグ」を取り上げます。プログラムの動作には影響しませんが、その文書を読んだユーザーに不信感を与えかねない危険なバグなのです。