Uploaded image for project: 'C++ Standard Library'
  1. C++ Standard Library
  2. STDCXX-93

[MSVC 8.0] time_get crashes when calling get_date

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.1.2, 4.1.3, 4.1.4
    • 4.2.0
    • Examples
    • None
    • Visual C++ 8.0

    • Runtime Error

    Description

      Test case:
      // Following code snippet is taken from examples\manual\time_get.cpp

      // NOTE: A SunPro bug requires time.h preceed locale. PR #26255
      #include <ctime> // for struct tm
      #include <locale> // for locale, time_get
      #include <sstream> // for stringstream
      #include <iostream> // for cout, endl

      // Print out a tm struct value in one atomic operation
      std::ostream& operator<< (std::ostream &os, const std::tm &t)
      {
      std::stringstream strm;

      strm << "Daylight Savings = " << t.tm_isdst
      << "\nDay of year = " << t.tm_yday
      << "\nDay of week = " << t.tm_wday
      << "\nYear = " << t.tm_year
      << "\nMonth = " << t.tm_mon
      << "\nDay of month = " << t.tm_mday
      << "\nHour = " << t.tm_hour
      << "\nMinute = " << t.tm_min
      << "\nSecond = " << t.tm_sec
      << '\n';

      // guard for thread safety and output synchronization
      const std::ostream::sentry guard (os);

      if (guard)
      os.rdbuf ()->sputn (strm.str ().c_str (), strm.str ().size ());
      else
      os.setstate (os.failbit);

      return os;
      }

      int main ()
      {
      typedef std::istreambuf_iterator<char, std::char_traits<char> > Iter;

      // time struct to parse date into
      static std::tm timeb; // zero initialized

      // Unused, required by time_get
      std::ios_base::iostate state;

      // Stream object to read from
      std::istringstream ins ("");

      // Iterators into the stream object
      Iter begin (ins);
      Iter end;

      // Get a reference to the time_get facet in locale loc.
      const std::time_get<char, Iter> &tg =
      std::use_facet<std::time_get<char, Iter> >(std::locale ("C"));

      // Display time_base::dateorder value.
      std::cout << "time_base::dateorder == " << tg.date_order () << ".\n";

      // Insert date string into stream.
      ins.str ("04/07/69");

      // get_date from the stream and output tm contents.
      tg.get_date (begin, end, ins, state, &timeb);
      std::cout << "Date: Apr 7 1969\n" << timeb << std::endl;

      return 0;
      }

      Stack Trace:

      > msvcr80d.dll!_mbstowcs_l_helper(wchar_t * pwcs=0x008e2b78, const char * s=0x008e6008, unsigned int n=1812, localeinfo_struct * plocinfo=0x0012f740) Line 71 C++
      msvcr80d.dll!_mbstowcs_s_l(unsigned int * pConvertedChars=0x0012f7b0, wchar_t * pwcs=0x008e2b78, unsigned int sizeInWords=1812, const char * s=0x008e6008, unsigned int n=4294967295, localeinfo_struct * plocinfo=0x0012f7d4) Line 259 + 0x30 bytes C++
      msvcr80d.dll!_wcsftime_l_stat(wchar_t * wstring=0x008e2b78, unsigned int maxsize=1812, const wchar_t * wformat=0x00473980, const tm * timeptr=0x0012f858, localeinfo_struct * plocinfo=0x0012f7d4) Line 101 + 0x32 bytes C++
      msvcr80d.dll!_wcsftime_l(wchar_t * wstring=0x008e2b78, unsigned int maxsize=1812, const wchar_t * wformat=0x00473980, const tm * timeptr=0x0012f858, localeinfo_struct * plocinfo=0x00000000) Line 152 + 0x1e bytes C++
      msvcr80d.dll!wcsftime(wchar_t * wstring=0x008e2b78, unsigned int maxsize=1812, const wchar_t * wformat=0x00473980, const tm * timeptr=0x0012f858) Line 162 + 0x17 bytes C++
      time_get.exe!_rw::rw_get_timepunct(const __rw::_rw_facet * pfacet=0x0049465c, int flags=64, unsigned int inx=0) Line 695 + 0x28 bytes C++
      time_get.exe!_rw::rw_get_timepunct(const __rw::_rw_facet * pfacet=0x0049465c, int flags=64, const void * * names=0x0012fc40, unsigned int * sizes=0x0012faa8) Line 1115 + 0x11 bytes C++
      time_get.exe!_rw::rw_get_timepunct(const __rw::_rw_facet * pfacet=0x0049465c, int * data=0x0012fa4c, tm * tmb=0x0012fa78, int * * pmem=0x0012fa6c, const void * * names=0x0012fc40, unsigned int * sizes=0x0012faa8) Line 1452 + 0x23 bytes C++
      time_get.exe!std::time_get<char,std::istreambuf_iterator<char,std::char_traits<char> > >::do_get(std::istreambuf_iterator<char,std::char_traits<char> > __it=

      {...}, std::istreambuf_iterator<char,std::char_traits<char> > __end={...}

      , std::ios_base & __fl=

      {...}

      , _rw::_rw_iostate & __err=-858993460, tm * __tmb=0x00492518, char __fmt='x', char __modifier=0) Line 175 + 0x2c bytes C++
      time_get.exe!std::time_get<char,std::istreambuf_iterator<

      Attachments

        Issue Links

          Activity

            People

              sebor Martin Sebor
              vick Vikas Mehta
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Slack

                  Issue deployment