[Boost-bugs] [Boost C++ Libraries] #4081: gcc warns about "comparision always true" for basic_binary_oarchive

Subject: [Boost-bugs] [Boost C++ Libraries] #4081: gcc warns about "comparision always true" for basic_binary_oarchive
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2010-04-09 23:52:46

#4081: gcc warns about "comparision always true" for basic_binary_oarchive
 Reporter: kab@… | Owner: ramey
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: serialization
  Version: Boost 1.42.0 | Severity: Problem
 Keywords: |
 When upgrading to boost 1.42 I (and some other users too) ran into a
 problem with spurious warnings from (some versions of) gcc.

 Several of the save_override members of basic_binary_oarchive contain
 asserts to verify that the value about to be written is within a
 certain bound. Some of the test are in actual fact tautological, since
 they are of the form "x <= numeric_limits<T>::const_max" with x being
 of type T.

 Ordinarily that wouldn't be a big deal, since the compiler can simply
 optimize away the test, and it provides at least some documentation of
 intent, and may provide some benefit against future changes elsewhere
 leading to unexpected problems.

 Unfortunately, for a substantial range of gcc versions, gcc issues a
 warning for such a tautological test, and worse yet, provides no
 mechanism for controlling the generation of these warnings. The
 specific warning is

     comparison is always true due to limited range of data type

 This is the subject of gcc bug 12963. The problematic version range
 appears to be from gcc 3.3.2 up to but not including gcc 4.3. From gcc
 4.3 onward this is controlled by -W[no-]type-limits, which defaults to
 disabled and is enabled by -Wextra.

 Frankly I'm hard-pressed to think of a situation where I'd want to
 enable this warning, but unfortunately there's simply no way to
 disable it prior to gcc 4.3.

 I've locall worked around this gcc bug by patching the asserts in
 question to use boost.numeric.conversion to perform the range check,
 as it carefully optimizes out tests guaranteed to succeed, and so
 avoids triggering the warning in question. Specifically, my patch
 introduces the following helper function for use as the assertion

     template<class T, class S>
     bool save_override_check(S s) {
         return boost::numeric::cInRange
             == boost::numeric::converter<T, S>::out_of_range(s);

 which is used as


 This was a sufficient solution for my local patch. However, it might
 not be desirable to add boost.numeric.conversion to the serialization
 library's dependencies just for this. A different approach would
 involve adding a value_type typedef to the classes defined by
 BOOST_STRONG_TYPEDEF, and change the tests to something like (with
 appropriate addition of "typename" and namespace qualifiers):

     template<class T, class S>
     bool save_override_check(S s) {
         return (numeric_limits<S::value_type>::const_max
                 <= numeric_limits<T>::const_max)
             || (s.t <= boost::numeric_limits<T>::const_max);

 Hopefully in this situation gcc would not warn about the now
 unreachable tautological comparision. I presume it would not complain
 about the comparison of two constants.

 The addition of a value_type typedef to the strong-typedef mechanism
 has some appeal independently of this, just for generally allowing
 some introspection on such types.

 My local patch didn't take the value_type approach because that would
 involve patching more files, and because I didn't have time to
 actually try it and perhaps discover that gcc was more stupid than I
 expected about this warning and still issued it in that situation.

 In followup discussion of this issue on the boost list, Robert Ramey
 had this to say:

     Well, this discussion makes me want to re-consider - at my
     leasure - what kind of checking - if any - should be done. It
     touches upon other issues as well, such as my imposed requirement
     that all archives should act identical.

Ticket URL: <https://svn.boost.org/trac/boost/ticket/4081>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:02 UTC