• ベストアンサー

fscanf(),scanf()とBuffer Overflow

scanf("%s", buf); で、bufの長さはどれくらいに取ればよいのでしょう。 sscanf(buf,"%s",buf2); なら、sizeof(buf)以上に大きくならないでしょうが、scanf(), fscanf()で文字列を読み込むときは、Buffer Overflowの危険から逃れられないような気がしています。 私はそのため、文字列を扱うときには、この二つの関数を使わないでいるのですが、安全な使用方法はあるのでしょうか? scanf("%10s",buf); のような使い方は知っています。でもこれでは文字数が10文字だったのか、それ以上だったのか判別できません。知りたいのは最大文字数が未知の場合です。 こう使えば安全という使い方があればぜひご紹介ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

こんなのはどうでしょうか? if (scanf("%10s%c", buf, &c) < 2 || isspace(c))  puts("10文字以下だった"); else  puts("10文字を超えてちょん切られた。"); あまりパッとしませんね。

mac_res
質問者

お礼

ありがとうございます。 なかなかよい案だと思います。ただ、10文字を超えていたとき次の読み込みで、文字列を繋ぎ修復する処理が厄介ですね。

その他の回答 (11)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.2

Cでは、安全でない関数は仕様上安全でないため、その関数をそのままで安全に使う方法はありません。 scanf(3)とfscanf(3)は、mktemp(3)やtempnam(3)ほど危険ではないにせよ、gets(3)と同程度には安全ではないです。 だからこそ、代替手法というのが確立している訳ですよね。

mac_res
質問者

お礼

ありがとうございます。 しかし、その危険に気づかず何の気なしに使っている人は多いようで、このカテゴリの回答の中にも多数のscanf()を使った回答を見かけます。 【使ってはいけないC func】とか、【本当は怖いC func】などという本や、Web pageはないでしょうか? 無造作にgets(3), strcpy(3), sprintf(3)を例題として使っている本ならいくらでもありそうですが…

関連するQ&A