「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
以下の様に、BOFを引き起こす可能性がある引数チェックされない関数が多い。
# | 関数 | 代替案/対策 | 用法 | 備考 |
1 | char *gets(char *s) 標準入力から一行を取り込む。 | char *fgets(char *s, int n, FILE *stream); | fgets(dst , sizeof(dst) , stdin); | gets と異なり ・引数に最大読み込み文字数を指定する。 ・改行文字も 1文字として数える。 ・実際読むのはn-1で最後は終端ナル(NULL)文字になる。 ・終端記号は、末尾の改行を置換ではなく改行の後ろに付与 ・最大文字数を超えた場合でも終端ナル(NULL)文字を保証 |
2 | char *strcpy(char *dst, const char *src); src文字列をdst文字列バッファに'\0' までコピー | void *memset(void *buf, int ch, size_t n); char *strncpy(char *dst, const char *src, size_t n); | memset(dst, 0 , sizeof(dst)); -> strncpy(dst, src, sizeof(dst) - 1); | ・コピーされる文字の長さは、src長とnのいずれか小さい方。 ・src長がnより短い場合、終端ナル(NULL)文字を保証 |
3 | char *strcat(char *dst, const char *src); src文字列をdst文字列バッファに'\0' まで連結 | char *strncat(char *dst, const char *src, size_t n); | strncat(dst, src, sizeof(dst) - strlen(dst) - 1) | ・文字列連結される文字の長さは、src長とnのいずれか小さい方。 ・src長がnより短い場合、終端ナル(NULL)文字を保証 |
4 | int sprintf(char *dst, const char *format, ...); 可変個引数をstring.Format()的に処理しdst文字列バッファに格納。 | - | sprintf(dst, ”%.{B}s”, data) | {B} = 書式指定子の精度(最大文字数) = dstの要素数 - 書式指定子以外の文字数 - 1(終端ナル(NULL)文字) |
5 | int snprintf(char *dst, size_t n, const char *format, ...); | snprintf(dst, sizeof(dst), ”%s”, data) | 動作としては、fgets()に近く、実際読むのはn-1で最後は終端ナル(NULL)文字になる。 | |
6 | int scanf(const char *format, ...); 標準入力から空白、タブ、改行で分割された文字列を読みstring.Format()的に処理し格納可変個引数に格納。 | - | scanf(”%.{B}s”, dst) | {B} = 書式指定子の精度(最大文字数) = dstの要素数 - 書式指定子以外の文字数 - 1(終端ナル(NULL)文字) |
7 | int sscanf(char *src, const char *format, ...); src文字列をstring.Format()的に処理し格納可変個引数に格納。 | - | sscanf(src, ”%.{B}s”, dst) | {B} = 書式指定子の精度(最大文字数) = dstの要素数 - 書式指定子以外の文字数 - 1(終端ナル(NULL)文字) |
8 | int fscanf(FILE *fp, const char *format, ...); ストリームをstring.Format()的に処理し格納可変個引数に格納。 | - | fscanf(fp, ”%.{B}s”, dst) | {B} = 書式指定子の精度(最大文字数) = dstの要素数 - 書式指定子以外の文字数 - 1(終端ナル(NULL)文字) |
9 | getchar();, fgetc(fp);, getc(fp); 入力から一文字を取り込む。 | - | - | 使用する際にバッファ境界チェックを行う。 |