【问题标题】:error C4996: 'ctime' [duplicate]错误 C4996:'ctime' [重复]
【发布时间】:2013-06-24 21:02:51
【问题描述】:

我有一个关于静态源代码分析的项目。 错误消息:“错误 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;
    }

【问题讨论】:

  • 等等,微软是否将 C4996 的类型从警告更改为错误?

标签: c++ ctime


【解决方案1】:

编译器消息完全来自使用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;
}

【讨论】:

  • 错误:错误 C2065:'date_to':未声明的标识符错误 C2228:'. c_str' 必须有类/结构/联合
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多