エラーの例:メモリ破壊
メモリ破壊は、もっとも重大なエラーです。特に、開発者が気付かないうちにメモリ破壊が発生している場合、問題は深刻です。
例
次のプログラムは、コマンドラインから入力された文字列を連結し、画面に出力します。
通常のコンパイラを使ってコンパイルし、実行した場合、一見プログラムは正常に動作しているように見えます。このため、実際には重大なプログラム破壊のバグがあるにもかかわらず、プログラムは正常に動作していると見なされてしまいます。
Insure++ を使ってコンパイルし、実行した場合、これは、7 行目で割り当てている16 文字に対して、それよりも多い文字列を書き込もうとしているからです。
図Aは、Insure++が上記のエラーを検出した状態です。Insure++は、発生したエラー、とメモリブロックの状態、アドレス、変数名、ソースコードのファイル名、行番号、スタックトレースなど、修正に役立つ情報をレポートします。Insure++のレポートから、メモリ書き込みオーバーフロー、つまり確保したメモリ以上に書き込みを行なっていることがわかります。
Insure++ は、変数の有効範囲を超えたメモリの上書きと読み込みに関連するすべての問題を検出します。変数が静的に割り当てられている場合 (グローバル変数の場合) でも、スタック上でローカルに割り当てられている場合でも、malloc や new で動的に割り当てられている場合でも、共有メモリ ブロックとして割り当てられている場合でも、問題を検出します。
例
次のプログラムは、コマンドラインから入力された文字列を連結し、画面に出力します。
01: /*
02: * File: hello.c 03: */ 04: int main (int argc, char *arvc[]) 05: { 06: int i; 07: char str[16]; 08: 09: str[0] = '\0'; 10: for(i=0; i< (argc-1)) strcat(str, " "); 11: strcat(str, argv[i]); 12: if(i < (argc-1)) strcat(str, " "); 13: } 14: printf("You entered: %s\n", str); 15: return (0); 16: } |
通常のコンパイラを使ってコンパイルし、実行した場合、一見プログラムは正常に動作しているように見えます。このため、実際には重大なプログラム破壊のバグがあるにもかかわらず、プログラムは正常に動作していると見なされてしまいます。
Insure++ を使ってコンパイルし、実行した場合、これは、7 行目で割り当てている16 文字に対して、それよりも多い文字列を書き込もうとしているからです。
図Aは、Insure++が上記のエラーを検出した状態です。Insure++は、発生したエラー、とメモリブロックの状態、アドレス、変数名、ソースコードのファイル名、行番号、スタックトレースなど、修正に役立つ情報をレポートします。Insure++のレポートから、メモリ書き込みオーバーフロー、つまり確保したメモリ以上に書き込みを行なっていることがわかります。
図A
Insure++ は、変数の有効範囲を超えたメモリの上書きと読み込みに関連するすべての問題を検出します。変数が静的に割り当てられている場合 (グローバル変数の場合) でも、スタック上でローカルに割り当てられている場合でも、malloc や new で動的に割り当てられている場合でも、共有メモリ ブロックとして割り当てられている場合でも、問題を検出します。
Insure++に
関するお問い合わせ
テクマトリックス株式会社
東京本社ソフトウェアエンジニアリング事業部
03-4405-7853
- メールでのお問い合わせ
- parasoft-info@techmatrix.co.jp