バッファオーバーランの危険性と対策
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/02 16:40 UTC 版)
「strcat」の記事における「バッファオーバーランの危険性と対策」の解説
strcatは、先程示した実装例を見ても分かる通り、s1の容量については一切関知しない。よって、s1の指す配列の範囲を越えて、s2が書き込まれてしまうバッファオーバーランの恐れがある。バッファオーバーランによってメモリが破壊されたり、プログラムが異常動作したり、クラッシュしたりする危険性がある。簡単な対策として、冗長になるが事前に領域長計算を実行する例を示す。 char s1[80] = "filename";const size_t bufsize = sizeof(s1); /* 固定長char配列の要素数を求める */const size_t s1len = strlen(s1);const char* s2 = ".exe";const size_t s2len = strlen(s2);if (s1len + s2len + 1 <= bufsize) /* 1は終端NUL文字用 */{ strcat(s1, s2); /* 以下でも可能だが、さらに冗長となるだけで意味はない。 */ /*strncat(s1, s2, s2len);*/} 上の例では、事前にchar型配列s1全体のバッファサイズすなわち要素数と、使用済み領域の長さおよび書き込みに必要な領域の長さを比較することによって、配列の空きの容量を超えた書き込み(バッファオーバーラン)を防ぐことができる。なお、さらに異常系や汎用目的を考慮するならば、s1の内容が未初期化で終端NUL文字が含まれていない場合や、s1len + s2len + 1が算術オーバーフローを起こしてしまう場合への対処も必要となってくる。 ただし、バッファオーバーランを防止するための事前領域長計算は、余分な時間的オーバーヘッドや複雑さを伴う。字数制限付き文字列連結関数としてstrncatも存在するが、書き込み先のバッファサイズを指定できるわけではないので、やはりstrcat同様の危険性を持つことに変わりはない。 代替として、標準ライブラリの一部ではないがstrlcatやstrcat_sを使用することのできる処理系もある。そのほか、単純な文字列連結用途としてはややオーバースペックではあるが、snprintfを使用する方法もある。
※この「バッファオーバーランの危険性と対策」の解説は、「strcat」の解説の一部です。
「バッファオーバーランの危険性と対策」を含む「strcat」の記事については、「strcat」の概要を参照ください。
バッファオーバーランの危険性と対策
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/02 16:40 UTC 版)
「strcpy」の記事における「バッファオーバーランの危険性と対策」の解説
strcpyはコピー先のバッファの長さを関知しない。もしコピー元の文字列の長さがコピー先のバッファの長さよりも大きい場合は、バッファオーバーランによってメモリが破壊されたり、プログラムが異常動作したり、クラッシュしたりする危険性がある。簡単な対策として、冗長になるが事前に領域長計算を実行する例を示す。 char dst[80];const size_t bufsize = sizeof(dst); /* 固定長char配列の要素数を求める */const char* src = "abc 123";const size_t srclen = strlen(src);if (srclen + 1 <= bufsize) /* 1は終端NUL文字用 */{ strcpy(dst, src); /* 以下でも可能だが、さらに冗長となるだけで意味はない。 */ /*strncpy(dst, src, srclen + 1);*/ /* +1は最後に終端NUL文字を付加するために必要 */} 字数制限付き文字列コピー関数としてstrncpyも存在するが、書き込み先のバッファサイズを指定できるわけではないので、やはりstrcpy同様の危険性を持つことに変わりはない。 代替として、標準ライブラリの一部ではないがstrlcpyやstrcpy_sを使用することのできる処理系もある。そのほか、単純な文字列コピー用途としてはややオーバースペックではあるが、snprintfを使用する方法もある。
※この「バッファオーバーランの危険性と対策」の解説は、「strcpy」の解説の一部です。
「バッファオーバーランの危険性と対策」を含む「strcpy」の記事については、「strcpy」の概要を参照ください。
- バッファオーバーランの危険性と対策のページへのリンク