バグ検出ドリル(1)「さあ、バグを見つけよう」山浦恒央の“くみこみ”な話(101)(3/4 ページ)

» 2017年12月15日 10時00分 公開

問題2の解答

 2点間の距離Lをkmではなく、マイルで出力している。

 リスト2-1をもう一度読んでください。赤道半径の単位は、kmとなっています。そのため、純粋に計算すると計算結果は「km」で出力します。ですが、この仕様上、どちらの単位系の指定がないため、実装者によっては異なる単位系で算出する可能性があります。このプログラムでは、米国用に、kmで計算した距離に対し、「0.62137」を乗じて、マイルに変換しています。つまり、仕様が曖昧になっています。

 世界の「長さの単位」はメートルだけではありません。例えば、米国ではヤードやマイルを使う可能性があります。単位の未記載は、軽微な抜けですが、場合によっては致命的なバグになります※1)

※1)仕様の抜けが発生すると、仕様定義者と実装者で問題の押し付け合いが起こります。クライアントが承認した仕様書通りに開発したのに、クライアントは「そんなことは言っていない」と主張し、ソフトウェア開発側が「そちらが承認した仕様書の通りだ」と泥仕合になります。訴訟に発展することも少なくありません(特に、海外の発注案件では頻発します)。仕様定義者は、「細かいことまで書いたらきりがない」と言い、実装者は、「仕様に書いていないから」と反論します。「両者がうまく協力し合えれば」と常々思いますが、大抵は「あっちはあっちでしょ」と知らないふりをします。仕様の抜けは大きなトラブルになりますし、バグで最も多いのが「仕様の抜け」です。くれぐれもご注意を。

 例えば、この仕様から、東京駅から大阪駅までの距離を算出するとします。リスト3に東京駅と大阪駅、それぞれの緯度と経度を示します。なお、緯度、経度はGoogle Mapsのデータを参照しました。

駅名 緯度[°] 経度[°]
東京駅 35.6811622 139.7320322
大阪駅 34.7024804 135.4609312
リスト3 東京駅と大阪駅の緯度経度

 東京駅と大阪駅の距離は、リスト3のようになります。リスト3のデータを計算式に入れると、2点間の距離は約403kmと出ます。これをマイルに換算すると、250マイルとなり、約0.62倍も違う結果となります。

Copyright © ITmedia, Inc. All Rights Reserved.