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

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> 開発ノウハウ 等 >> 2.言語に対する理解不測編

バグが発生しやすい王道パターン - 2.言語に対する理解不足編

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

2-1. NULL終端に対する意識の欠如(C言語)

C言語の文字列はNULL終端がお約束です。 ところが、うっかりこれを忘れてしまうと、次の様なコードを書いてしまいます。
char str[] = "abcdef";
char * p;

p = (char *)malloc(strlen(str));
strcpy(p, str);
puts(p);
free(p);
C言語にて文字列をコピーする場合、 終端のNULL分も考慮し、メモリは「文字列長 + 1」を確保する 事が鉄則です。 (上記の例では、malloc内を strlen(str) + 1 にします。) +1 を忘れることによって、strcpy時にメモリ上の1byteが、予期せず上書きされてしまいます。 それによって引き起こされる弊害は、まさに「神のみぞ知る」状態であり、 テスト時には正常にプログラムが動作していても、運用を開始して数日後にエラーが発生!! といった可能性も十分に考えられます。((( ;゚Д゚)))ガクガクブルブルガクガク

2-2. ローカル変数の初期化

グローバル変数やstatic変数は、大抵のプログラミング言語で、 プログラム起動時にデフォルト値 (整数型なら0, 浮動小数点型なら0.0, boolean型ならfalse) に初期化される事が保証されています。 しかし、ローカル変数については、少々気をつける必要があります。 以下のphpコードを見てください。
[PHP]
while (true) {
    echo $i;
    if (++$i == 5) {
        break;
    }
}
このコードを実行すると、1234と表示されます。 phpにおいては、初期化されていないローカル変数(この場合$i)には、NULLが入ります。 そして、NULLに++演算子を使用すると、NULLを0とみなし、$iに1が入ります。 次に、以下のC言語コードを見てください。
[C言語]
int i;

while (1) {
    printf("%d", i);
    if (++i == 5) {
        break;
    }
}
このコードの実行結果は、またしても「神のみぞ知る」です。 C言語においては、初期化されていないローカル変数の値は保障されておらず(俗にいう ゴミ値)、 大抵の場合、延々と値が表示され続ける事になります。 このように、 プログラミング言語によって、明示的に初期化されていないローカル変数の値が異なる という事に留意する必要があります。
バグが発生しやすい王道パターン - 3.コンパイラ言語のデータ型処理に対する認識不足編へ続く
         このエントリーをはてなブックマークに追加   


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




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





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




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