トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> 開発ノウハウ 等 >> 1.タイプミス編

バグが発生しやすい王道パターン - 1.タイプミス編

プログラミングにおいて、『 こういった時(こういった箇所)でバグが発生しやすいぞ~ 』というのを纏めてみました ^^;)
(※あくまで管理人の独断と偏見、それに、少々の経験に基づいたものですのであしからず)

1-1. 条件分岐で、比較を代入にしてしまう

if (a == b) {...} を

if (a = b) {...} とタイプミス
= と == という、コード的には1文字しか違わないタイプミスですが、 変数aがbの値で上書きされてしまい、かつ、変数bが0以外の場合は条件が成立してしまうという、かなり深刻なバグ。 そして、"タイプミス"とはいえ、 コンパイラやインタプリタがシンタックスエラーとして教えてくれるわけではない という事も留意しておく必要があります。

1-2. 意図しないコードブロック

( a == b の場合に、hogehoge()を実行するコード )
if (a == b)
    hogehoge();
を、 (a == b の場合に、hogehoge(), fugafuga()を実行する) に変更しようとして、
if (a == b)
    hogehoge();
    fugafuga();
と修正してしまう 等。 ↑のコードは、
if (a == b) {
    hogehoge();
}

fugafuga(); 
と等価です。 条件分岐やループの後にステートメントが1つしかない場合でも、{}をつけよう と、ここでも述べました。

1-3. 「;(←セミコロン)」のつけ忘れ

大抵はシンタックスエラーが出るので、バグ箇所が一目瞭然なのですが、 例えば以下の様な場合に注意が必要です。
#include <stdio.h>

struct tagUser {
    int id;
    int age;
    char name[20];
}


//************* エントリーポイント ***********//

main(void)
{
    puts("main関数だよ");
    return 0;
}
↑のコードをVC++2005で実行すると、Buildは通ってもLinkerが異常終了します。(←わりと珍しい現象ですw) 理由は、tagUser構造体を宣言 (struct tagUser {...} ) した後に、セミコロンが抜けている為です。 セミコロンが抜けているせいで、 「tagUser構造体の宣言 と main関数」ではなく、 「main関数の戻りで tagUser構造体を返す」という意味になってしまっています。 (それなのに0を返しているので、Linkerが悲鳴をあげて落ちたということですね♪^^) 一見するとなかなか気付きにくいバグの為、main関数内を精査するのに時間を費やし、工数を無駄使いしてしまいそうです・・・。
バグが発生しやすい王道パターン - 2.言語に対する理解不足編へ続く
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。