ошибка C4996: 'ctime'

У меня есть проект о статическом анализе исходного кода. Сообщение об ошибке: «ошибка 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;
    }

person lilya    schedule 27.06.2013    source источник
comment
Подождите, Microsoft изменила тип C4996 с предупреждения на ошибку?   -  person Medinoc    schedule 27.06.2013


Ответы (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;
}
person Medinoc    schedule 27.06.2013
comment
Ошибка: ошибка C2065: 'date_to': необъявленная ошибка идентификатора C2228: слева от '. c_str' должен иметь класс/структуру/объединение - person lilya; 27.06.2013