none
C++の変数スコープの警告を正すには? RRS feed

  • 質問

  • vC++2019comunication版ののDLLプログラムで、変数スコープの問題かとおもうのですが、下記のコードの最後の125行目で、コンパイル時に警告が出ます。
    一応static変数で定義しているので、終了まで有効と考えていて、また動作も一応問題ありません。
    この警告を出さないようにするコードはどのようにすれば良いでしょうか。警告をオプションで抑止するのでなくです。
    コンパイラはわずかの可能性も見て警告しているのだと思いますが。コンパイラの意図している通りにはどうすれば良いでしょうか。

    警告 C6387 'fpl' は '0' である可能性があります: この動作は、関数 'fprintf_s' の指定に従っていません。 125 
    // dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    static FILE  *fpl;

    //----------------------------------------------------------------------------------------
    extern "C" __declspec(dllexport) int __cdecl _init( int ymd, int hms)
    {
     sprintf_s(fname,100, "c:/fxs/nn23dll_%02d%02d%02d%02d.txt",
          newtime.tm_mon+1,newtime.tm_mday, newtime.tm_hour, newtime.tm_min);
     err = fopen_s(&fpl, fname, "w");
     // if(_get_errno(&err);
     if (err != 0) {
      std::cout<<"open error " ;
      std::cin.get();
     }
     fprintf_s(fpl, "init svrsecorg=%d ymd=%d y=%d m=%d d=%d  hms=%d:%d:%d p_tsp=%d p_thr=%f p_eta=%f\n",
              svrsecorg,  ymd,year,mon,day, hour,pun,sec,p_tsp,p_thr, p_eta);
    ・・・・・・・・・・・

    2019年10月18日 4:13

回答

  •  err = fopen_s(&fpl, fname, "w");
     // if(_get_errno(&err);
     if (err != 0) {
      std::cout<<"open error " ;
      std::cin.get();
     }
     fprintf_s(fpl, "init svrsecorg=%d ymd=%d y=%d m=%d d=%d  hms=%d:%d:%d p_tsp=%d p_thr=%f p_eta=%f\n",
              svrsecorg,  ymd,year,mon,day, hour,pun,sec,p_tsp,p_thr, p_eta);
    errによりfopen_sの失敗を把握していながら処理を継続している点を、コンパイラーは問題視しています。fopen_sが失敗したのであれば、fplを使用しないようコードを記述する必要があります。
    • 回答としてマーク sige2 2019年10月26日 9:29
    2019年10月18日 5:33
  • sige2さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    佐祐理さんに同意します。fopen_sが失敗した場合、fplを使用しないようにコードを記述する必要があります。
    NULL以外のポインターをテストして、警告を除去する必要があります。

    コードは次のとおりです。

             FILE *fpl = NULL;
             errno_t err;
    
             err =  fopen_s(& fpl, fname, "w");
             if (!err && fpl != NULL)
                       fclose(fpl);

    どうぞよろしくお願いいたします。


    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク sige2 2019年10月26日 9:30
    2019年10月23日 8:42
    モデレータ

すべての返信

  •  err = fopen_s(&fpl, fname, "w");
     // if(_get_errno(&err);
     if (err != 0) {
      std::cout<<"open error " ;
      std::cin.get();
     }
     fprintf_s(fpl, "init svrsecorg=%d ymd=%d y=%d m=%d d=%d  hms=%d:%d:%d p_tsp=%d p_thr=%f p_eta=%f\n",
              svrsecorg,  ymd,year,mon,day, hour,pun,sec,p_tsp,p_thr, p_eta);
    errによりfopen_sの失敗を把握していながら処理を継続している点を、コンパイラーは問題視しています。fopen_sが失敗したのであれば、fplを使用しないようコードを記述する必要があります。
    • 回答としてマーク sige2 2019年10月26日 9:29
    2019年10月18日 5:33
  • 早速のご返事ありがとうございます。

    コンパイラーは賢いですね、そんなケースも見逃さないとは。

    2019年10月18日 6:07
  • sige2さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    佐祐理さんに同意します。fopen_sが失敗した場合、fplを使用しないようにコードを記述する必要があります。
    NULL以外のポインターをテストして、警告を除去する必要があります。

    コードは次のとおりです。

             FILE *fpl = NULL;
             errno_t err;
    
             err =  fopen_s(& fpl, fname, "w");
             if (!err && fpl != NULL)
                       fclose(fpl);

    どうぞよろしくお願いいたします。


    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク sige2 2019年10月26日 9:30
    2019年10月23日 8:42
    モデレータ
  • そうですね。そのようにしています。

    VC++の出すエラーや警告役に立つ場合もありました。ゼロにすべくがんばりました。

    2019年10月26日 9:32