0

静的ソース コード分析に関するプロジェクトがあります。エラー メッセージ:「エラー C4996: 'ctime': この関数または変数は安全でない可能性があります」。これは、ctime でエラーが発生したコードの一部です。誰かがこのエラーを克服するのを手伝ってくれるなら、私はうれしいです.

 virtual bool onTLSConnect( const CertInfo& info )
    {
      printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n"
              "from: %s\nto: %s\n",
              info.status, info.issuer.c_str(), info.server.c_str(),
              info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(),
              info.compression.c_str(), ctime( (const time_t*)&info.date_from ),
              ctime( (const time_t*)&info.date_to ) );
      return true;
    }
4

1 に答える 1

0

コンパイラ メッセージはctimeまったく使用から来ていますが、使用すると誤った結果が得られます。 ctime への両方の呼び出しは、内部の静的なスレッド ローカル バッファーに同じアドレスを返しますprintf

少なくとも、これを行う必要があります。

virtual bool onTLSConnect( const CertInfo& info )
{
    std::string dateFrom(ctime(reinterpret_cast< const time_t* >(&info.date_from));
    std::string dateTo  (ctime(reinterpret_cast< const time_t* >(&info.date_to));

    printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n"
          "from: %s\nto: %s\n",
          info.status, info.issuer.c_str(), info.server.c_str(),
          info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(),
          info.compression.c_str(), dateFrom.c_str(),
          dateTo.c_str() );
  return true;
}

コンパイラに関しては、これを で完全に#define無効にすることも、必要なときにのみ無効にすることもできます。

virtual bool onTLSConnect( const CertInfo& info )
{
    #pragma warning(push)
    #pragma warning(disable:4996)
    std::string dateFrom(ctime(reinterpret_cast< const time_t* >(&info.date_from));
    std::string dateTo  (ctime(reinterpret_cast< const time_t* >(&info.date_to));
    #pragma warning(pop)

    printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n"
          "from: %s\nto: %s\n",
          info.status, info.issuer.c_str(), info.server.c_str(),
          info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(),
          info.compression.c_str(), dateFrom.c_str(),
          dateTo.c_str() );
  return true;
}
于 2013-06-27T12:01:42.037 に答える