C/C++でBOF(バッファオーバーフロー)を引き起こさないようにするための方法を表にまとめました。
※{}で囲ってある部分については、適当な整数に置き換える
| BOFを引き起こす可能性がある関数 | 代替案/対策 |
|---|---|
| gets( dest ) | fgets( dest , sizeof( dest ) , stdin ) |
| strcpy( dest , src ) | memset( dest , 0 , sizeof( dest ) ) -> strncpy( dest , src , sizeof( dest ) - 1 ) |
| strcat( dest , src ) | strncat( dest , src , sizeof( dest ) - strlen( dest ) - 1 ) |
| sprintf( dest , ”%s” , data ) | sprintf( dest , ”%.{B}s” , data ) snprintf( dest , sizeof( dest ) , ”%.{B}s” , data ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
| scanf( "%s” , dest ) | scanf( ”%.{B}s” , dest ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
| sscanf( str , "%s” , data ) | sscanf( str , ”%.{B}s” , data ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
| fscanf( fp , "%s” , data ) | fscanf( fp , ”%.{B}s” , data ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
| getchar() fgetc( fp ) getc( fp ) |
使用する際にバッファ境界チェックを行う。 |