デバッグの仕方事始め:Warningは友達
たまには仕事絡みの話でも…
というか、そろそろリハビリしないとコード書けなくなってしまう気が(´・ω・`)
プログラミングに「デバッグ」は付き物というか、料理に対する「味見」の様なもので普通やるものだと思っています。
# 味見しない料理って…みたいな。まぁ、僕は料理しませんがw
でも、意外とデバッグの仕方って知らないという人が多いのです(゜¬゜)
デバッグといいつつ今回のWarningとは、実際にデバッグらしいデバッグをする前段階の様なものです。
でも、これがある程度出来ていないコードは、デバッグをする価値が無いと思っています。
# どうでもいいバグばかりに埋れて、肝心の機能まで見る余裕が無くなる
簡単なサンプルコードです。
void sample (int aNumber, int aModulus) { int surplus = aNumber % aModulus; if (surplus = 0) { anyAction (aNumber); } return ; }
↑ 察しの良い方は多分見ただけでポイントが分かると思いますがw
aNumber
がaModulus
で割り切れた場合だけanyAction
を実行します。
たぶん。
で、簡単にコンパイルを掛けて見る。
$ cc -c sample.c $
↑ 何の警告もエラーもなく出来ました(∩´∀`)∩ワーイ
逆に困るけどね(´・ω・`)
だってこれ、うごかないもの。
コンパイラにgccを使っている場合-Wallオプションは最低限必須です。
$ cc -Wall -c sample.c sample.c: In function 'sample': sample.c:5: warning: suggest parentheses around assignment used as truth value sample.c:6: warning: implicit declaration of function 'anyAction'
↑おかしなポイントについてはきちんと警告をしてくれます(∩´∀`)∩ワーイ
5行目の警告は、見ての通り「比較と代入」の取り違えの可能性を指摘してくれています。
6行目の警告は、関数のプロトタイプ宣言が無い事を指摘してくれています。もしかしたら引数間違いとかがあったりするかもしれない(^_^;)
# C++ならエラーになりますが、それはそれとして
gccの-Wallオプションは、allと言っている割には生成してくれる警告は殆どが軽微な誤記・漏れ程度の間違いやすい箇所についての警告です。
実際にはもう少しオプションを足してもっと出した方が良いと思いますが、まぁ最低限レベルとして。
というか、業としてコードを書くなら、-Wallに怒られない程度のコードは常に書けるようにしようよ、という気分になるわけですが(´・ω・`)
# そこから更にlintなどの静的解析までするかまでは、規模なども関係しますが、どこまでやるかの趣味の領域かなぁと
話が少し逸れますが、ここで5行目の方の順序を変えて0 = surplus
にしたらエラーが出るよ!と言うのもちと違う(^_^;)
Foolproofとして良いのはわかるのですが…
読みやすいプログラムを書くというモチベーション - ksworks.org
例えばこんなソースコード。 ? 1 if (currentstate == STATEIDLE) … “if current state equal idle, then …” “if current state equal idle, then …” と英語風に読み上げることが出来たりする。
そして、だいたい読み上げられる物はわかりやすい。
↑ その後の読みにくさに繋がるので、保守性とかを考えると僕は食えないと思うわけです。
なんとも完全にデバッグの話とはずれてしまいましたが、これくらいは気をつけたいと言う自戒も含め、デバッグするに足るコードを書くのが重要という事で( ´ ▽ ` )ノ
- スポンサードリンク -