Modify

Opened 7 years ago

Closed 6 years ago

#4798 closed Patches (fixed)

date_time: valgrind warnings via strings_from_facet.hpp

Reported by: Lars Immisch <lars.immisch@…> Owned by: az_sw_dude
Milestone: To Be Determined Component: date_time
Version: Boost Development Trunk Severity: Cosmetic
Keywords: valgrind Cc:

Description

On Ubuntu, with GNU libc6 (2.7-10ubuntu7), and a program that uses boost::date_time::time_input_facet< boost::posix_time::ptime,char> valgrind generates a warning:

==11026== Conditional jump or move depends on uninitialised value(s)
==11026==    at 0x467C04B: __strftime_internal (strftime_l.c:574)
==11026==    by 0x467DD4F: strftime_l (strftime_l.c:490)
==11026==    by 0x456B420: std::__timepunct<char>::_M_put(char*, unsigned int, char const*, tm const*) const (in /usr/lib/libstdc++.so.6.0.13)
==11026==    by 0x452BB4C: std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, tm const*, char, char) const (in /usr/lib/libstdc++.so.6.0.13)
==11026==    by 0x452B0CF: std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, tm const*, char const*, char const*) const (in /usr/lib/libstdc++.so.6.0.13)
==11026==    by 0x8430C83: std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::date_time::gather_month_strings<char>(std::locale const&, bool) (strings_from_facet.hpp:58)
==11026==    by 0x84310D9: boost::date_time::format_date_parser<boost::gregorian::date, char>::format_date_parser(std::string const&, std::locale const&) (format_date_parser.hpp:188)
==11026==    by 0x8431435: boost::date_time::date_input_facet<boost::gregorian::date, char, std::istreambuf_iterator<char, std::char_traits<char> > >::date_input_facet(std::string const&, unsigned int) (date_facet.hpp:462)
==11026==    by 0x84315E0: boost::date_time::time_input_facet<boost::posix_time::ptime, char, std::istreambuf_iterator<char, std::char_traits<char> > >::time_input_facet(std::string const&, unsigned int) (time_facet.hpp:696)

The actual problem is in GNU libc6, strftime_l.c:574, which computes a 12 hour clock in __strftime_internal regardless of the format string:

  if (hour12 > 12)
    hour12 -= 12;
  else
    if (hour12 == 0)
      hour12 = 12;

The attached patch works around the warning by using an initialised struct tm in two places:

tm tm_value = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };

We'd very much appreciate if the attached patch was accepted, even if it is only cosmetic.

Attachments (1)

valgrind.cosmetic.patch (1004 bytes) - added by Lars Immisch <lars.immisch@…> 7 years ago.
Patch for uninitialized struct tm in strings_from_facet.hpp

Download all attachments as: .zip

Change History (5)

Changed 7 years ago by Lars Immisch <lars.immisch@…>

Patch for uninitialized struct tm in strings_from_facet.hpp

comment:1 Changed 6 years ago by marshall

This patch has the same problem as was observed in #3477 - on some platforms, struct tm has different numbers of elements. Is

tm tm_value = {};

sufficient to fix this problem?

comment:2 Changed 6 years ago by Lars Immisch <lars.immisch@…>

Yes, that fixes the problem.

(Thanks, clever! I didn't think of that)

comment:3 Changed 6 years ago by marshall

(In [70780]) Applied modified patch - Refs #4798

comment:4 Changed 6 years ago by marshall

  • Resolution set to fixed
  • Status changed from new to closed

(In [70983]) Merge date/time fixes to release. Fixes #4798

Add Comment

Modify Ticket

Change Properties
Set your email in Preferences
Action
as closed The owner will remain az_sw_dude.
The resolution will be deleted. Next status will be 'reopened'.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.