printf()のランタイムエラーを回避するには?


HoleInOne  2005-05-15 00:15:18  No: 57407

いつもお世話になっております。
VC++6.0 Console Appricationにて
HTTPクライアントを作成中なのですが、
サーバーから受信を行う際に
同じループ内にrecv()関数とprintf()関数を使用しています。
そのときに、たとえばwww.yahoo.comにアクセスしようとすると

Debug Error!
R6002
- floating point not loaded
というエラーがポップアップで出てしまいます。
何が原因なのかご教示お願い致します。

ループ部分のソースを下記に載せておきます。

  int nRecv, i;
  for(i = 0; i < MAX_RECV; i++)
  {
    memset(buf, '\0', sizeof(buf));
    nRecv = recv(pms->s, buf, (int)sizeof(buf) - 1, 0);
    printf(buf);
    fprintf(fp, "%s", buf);
    if (nRecv == 0){
      cout<<endl;
      fclose(fp);
      break;  
    }
  }


YuO  2005-05-15 03:41:56  No: 57408

>printf(buf);

これはやってはいけません。
(v)(s/f)printfでユーザー入力の文字列を出力したい場合は,
printf("%s", buf);
のようにしてやる必要があります。

というのは,
bufに%が含まれた場合にバグ,さらには脆弱性の原因となるからです。

R6002自体は,浮動小数点演算を行っていないのに,printfで%fを使った場合などに発生します。
よくやる逃げ方は,
double d = 0.0;
のような定義を加えてやることで,
強制的に浮動小数点演算ライブラリを読み込ませることです。
# そもそも,このエラーは普通は起きない……。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加