幅を指定しないscanfの文字列入力

幅を指定しないscanfの文字列入力

説明

scanf 系の %s やスキャンセット変換で幅を指定しないと、入力が出力先バッファーの容量を超えるおそれがあります。

想定される影響

  • スタックのバッファーオーバーフロー、クラッシュ、コード実行につながる可能性があります。

対処方法

書式文字列に出力先バッファーより小さい幅を指定するか、fgets を使用してください。

例

変更前

c
char name[16];
scanf("%s", name);

変更後

c
char name[16];
scanf("%15s", name);

解説:

  • 変更前: %s に入力幅の上限がありません。
  • 変更後: 16バイトのバッファーに対して最大15文字を指定し、終端のヌル文字を格納する領域を残しています。

参考資料