日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

ツールにツッコミを入れられた

先日、プログラムを一部修正したのだが、そのソースコードの記述についてチームリーダーから指摘が入った。

意味は変わらないだろうけど、こう書いたほうがいいし、こう書かないと解析ツールに指摘されるんじゃないかという話だった。

ごもっともな話だったので、修正しておいた。コンパイル結果のバイナリは全く一緒だったけど。


他の部分は大丈夫? ということで気になって部署で使ってる解析ツールで解析してみた。

するといろいろ引っかかるのがあるのだが、全ての指摘事項を消し去る必要は必ずしもない。

「この記述方法は注意が必要ですよ」ぐらいの意味なので、「これで正しいし、書き方も妥当です」という答えでもよい。

ただ、明らかに行儀の悪い書き方ってのもあって、これは直した方がいいなぁと思う指摘事項もまぁある。

とはいえ、修正してもコンパイル結果は全く一緒になるだろうなぁという事項がほとんどに思えた。

が、指摘事項の中で1つ気になることを発見してしまった。


それがこんなコードである。

if( (0 != foo & bar) && (val < VAL_MIN_FOO ) ){
  val = VAL_MIN_FOO;
}

ある条件にあてはまったときはvalの値に下限を設けて、下限より小さければ下限値に修正するというコードである。

これに対して「bool型とshort型の&演算をしています」という指摘があったのだ。

この書き方だと 0!=foo & bar は (0!=foo) & bar と解釈されてしまうんだよね。

この解釈は明らかに間違えていて、正しくはこうである。

if( (0 != (foo & bar) ) && (val < VAL_MIN_FOO ) ){

変数fooをbarでマスクして、それでも立っているビットがあれば、補正対象にするというのが正しい解釈である。


ただ、こんなに違うと当然意図したとおりに動かないわけで、なんでここまで気づかなかったのという話である。

このソースコードを書いたのはそれなりに前の話で、すでにこの部分はすでに動作確認済みという理解だったから。

それで、この部分の動作が間違っていたことによる影響を机上検討してみたところ、

なんとこの部分のソースコードが動いても動かなくても動作にはほとんど差がないということがわかった。

そもそもの設計がダメだったのだ。

というわけでこの部分について最初から見直した結果、今回指摘された部分のコードは消えることになった。


まさかこんな問題がこのタイミングで浮き出てくるとは思わなかっただけに、関係者は驚いたわけだが、

動作を見てるだけでは気づけない問題に気づけるのが解析ツールを使うメリットなのだろう。

解析ツールの指摘内容の大半はすでに考慮済み か 記述法はまずいが意図したとおりに動くものだから、

その点では解析ツールの結果はつまらないものが多いわけだが、よくよく調べてみるとバグが潜んでいるのを見つけられることがあると。

発見してしまったがために、それで1日潰れてしまったのは痛手だったが、長い目でみればよかったのかな。と思っている。


Author : hidemaro
Date : 2017/01/25(Wed) 19:29
C・C++ | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools