User manual - アプリケーション作成上の注意点ver.1.00(2008年5月26日)

3
1.プログラミング上の注意点
1-1.配列変数のオーバーフロー
【内容】
指定したサイズ以上の文字を配列変数に代入してしまう、もしくは配列に代入するつもりが、
エリア外に代入を行ってしまう。
これによって、配列外のエリアを破壊してしまい、以降の処理で暴走することがある。
【例】
UB abc[10];
strcpy(abc, "1234567890");
(上記の場合、文字数10とNULL文字の合計11バイトを要するため、配列は11バ
イト以上必要)
②bar_str[len-4]=\0;
(上記の指定で、len の値が4未満であったり、len-4 が宣言した配列の大きさを超えてい
た場合、配列外のエリアを破壊)
memcpy(abc, "1234567890", len-4);
(上記同様、len の値が4未満であったり、コピーデータが配列のエリアを超えていた場
合、配列外のエリアを破壊)
【対策】
・sizeof 演算子を利用する。
sizeof(配列変数名)で、配列の大きさが得られるので、その値を使用して
エリア外への書き込みを行わないようにする。
・変数の値を事前にチェックする。
添え字や代入文字数に変数を使用する場合、事前にその値をチェックする。
【対策例】
①strncpy(abc, 1234567890, sizeof(abc)-1);
abc[sizeof(abc)-1]=\0;
②if((len>=4)&&((len-4)<sizeof(bar_str)))
bar_str[len-4] = \0;
if ((len>=4)&&((len-4)<sizeof(abc)))
memcpy(abc, "1234567890", len-4);