[PATCH] D30593: Add correct "-isystem"/"-isysroot" warning handling to static analysis' BugReporter.

Kevin Marshall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 6 17:09:28 PST 2017


kmarshall added a comment.

That makes sense. In the cases that I'm finding, the original call site is in application source code, but the warning is generated from inside a system header. So, I suppose the suppressions are working as intended, and we just need to add one-off suppressions for the known noisy sources? Where is the suppression database located? FWIW, there aren't many unique error sources - I only counted 9 after running the warnings through "uniq | sort".

Re: specifics, here the most common one that I'm seeing. It seems like a bogus buffer overrun warning?

  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1258:9: note: Assigned value is garbage or undefined
          *__s++ = *__first++;
                 ^ ~~~~~~~~~~

The error is generated from this trivial logging line <https://cs.chromium.org/chromium/src/dbus/message.cc?rcl=255d25e6d389106b75c90110b4e00b022e472cc5&l=233>:

  LOG(FATAL) << "Unknown type: " << type;  // |type| is an enum

The offending C++ library code snippet is here (note the line w/comment "GENERATES WARNING")

  template<typename _CharT>
    _CharT*
    __add_grouping(_CharT* __s, _CharT __sep,
                   const char* __gbeg, size_t __gsize,
                   const _CharT* __first, const _CharT* __last)
    {
      size_t __idx = 0;
      size_t __ctr = 0;
  
      while (__last - __first > __gbeg[__idx]
             && static_cast<signed char>(__gbeg[__idx]) > 0
             && __gbeg[__idx] != __gnu_cxx::__numeric_traits<char>::__max)
        {
          __last -= __gbeg[__idx];
          __idx < __gsize - 1 ? ++__idx : ++__ctr;
        }
  
      while (__first != __last)
        *__s++ = *__first++;  // <------ GENERATES WARNING
  
      while (__ctr--)
        {
          *__s++ = __sep;         
          for (char __i = __gbeg[__idx]; __i > 0; --__i)
            *__s++ = *__first++;
        }
  
      while (__idx--)
        {
          *__s++ = __sep;         
          for (char __i = __gbeg[__idx]; __i > 0; --__i)
            *__s++ = *__first++;
        }
  
      return __s;
    }

Here's a full snippet of the analysis trace:

  ../../dbus/message.cc:233:9: note: Calling 'basic_ostream::operator<<'
          LOG(FATAL) << "Unknown type: " << type;
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../base/logging.h:414:23: note: expanded from macro 'LOG'
  #define LOG(severity) LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
                        ^
  ../../base/logging.h:402:62: note: expanded from macro 'LAZY_STREAM'
    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
                                                               ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:113:11: note: Assuming '__fmt' is not equal to 'oct'
        if (__fmt == ios_base::oct || __fmt == ios_base::hex)
            ^~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:113:11: note: Left side of '||' is false
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:113:37: note: Assuming '__fmt' is not equal to 'hex'
        if (__fmt == ios_base::oct || __fmt == ios_base::hex)
                                      ^~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:113:7: note: Taking false branch
        if (__fmt == ios_base::oct || __fmt == ios_base::hex)
        ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:116:9: note: Calling 'basic_ostream::_M_insert'
          return _M_insert(static_cast<long>(__n));
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:69:2: note: Taking true branch
          if (__cerb)
          ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/ostream.tcc:75:7: note: Calling 'num_put::put'
                  if (__np.put(*this, *this, this->fill(), __v).failed())
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.h:2336:16: note: Calling 'num_put::do_put'
        { return this->do_put(__s, __f, __fill, __v); }
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.h:2475:16: note: Calling 'num_put::_M_insert_int'
        { return _M_insert_int(__s, __io, __fill, __v); } 
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:868:22: note: Assuming '__basefield' is equal to 'oct'
          const bool __dec = (__basefield != ios_base::oct
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:869:8: note: Left side of '&&' is false
                              && __basefield != ios_base::hex);
                              ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:870:32: note: Assuming '__v' is <= 0
          const __unsigned_type __u = ((__v > 0 || !__dec)
                                        ^~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:870:32: note: Left side of '||' is false
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:870:31: note: '?' condition is true
          const __unsigned_type __u = ((__v > 0 || !__dec)
                                       ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:877:6: note: Assuming the condition is true
          if (__lc->_M_use_grouping)
              ^~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:877:2: note: Taking true branch
          if (__lc->_M_use_grouping)
          ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:884:6: note: Calling 'num_put::_M_group_int'
              _M_group_int(__lc->_M_grouping, __lc->_M_grouping_size,
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:839:21: note: Calling '__add_grouping'
        _CharT* __p = std::__add_grouping(__new, __sep, __grouping,
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1249:14: note: Assuming the condition is true
        while (__last - __first > __gbeg[__idx]
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1249:14: note: Left side of '&&' is true
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1250:10: note: Assuming the condition is true
               && static_cast<signed char>(__gbeg[__idx]) > 0
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1249:14: note: Left side of '&&' is true
        while (__last - __first > __gbeg[__idx]
               ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1249:7: note: Loop condition is true.  Entering loop body
        while (__last - __first > __gbeg[__idx]
        ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1254:4: note: Assuming the condition is false
            __idx < __gsize - 1 ? ++__idx : ++__ctr;
            ^~~~~~~~~~~~~~~~~~~
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1254:4: note: '?' condition is false
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1250:7: note: Left side of '&&' is false
               && static_cast<signed char>(__gbeg[__idx]) > 0
               ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1257:7: note: Loop condition is true.  Entering loop body
        while (__first != __last)
        ^
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1257:7: note: Loop condition is true.  Entering loop body
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1257:7: note: Loop condition is true.  Entering loop body
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1257:7: note: Loop condition is true.  Entering loop body
  ../../build/linux/debian_wheezy_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/locale_facets.tcc:1258:9: note: Assigned value is garbage or undefined
          *__s++ = *__first++;
                 ^ ~~~~~~~~~~


Repository:
  rL LLVM

https://reviews.llvm.org/D30593





More information about the cfe-commits mailing list