cppcheck icon indicating copy to clipboard operation
cppcheck copied to clipboard

use libc++ in conjunction with Clang in CI

Open firewave opened this issue 1 year ago • 7 comments

It provides additional annotations for the compiler and the sanitizers to detect more issues.

firewave avatar Sep 22 '24 17:09 firewave

[238/238][20.0s] clang-tidy-19 -p=/home/runner/work/cppcheck/cppcheck/cmake.output -quiet /home/runner/work/cppcheck/cppcheck/gui/xmlreport.cpp
/home/runner/work/cppcheck/cppcheck/lib/utils.h:57:5: error: an exception may be thrown in function '~OnExit' which should not throw exceptions [bugprone-exception-escape,-warnings-as-errors]
   57 |     ~OnExit() {
      |     ^

I filed a ticket about the OnExit bugprone-exception-escape false positive(?) upstream: https://github.com/llvm/llvm-project/issues/109587.

firewave avatar Sep 22 '24 19:09 firewave

TestBufferOverrun::negativeMemoryAllocationSizeError
=================================================================
==6310==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new vs free) on 0x508001cef5a0
    #0 0x557123dcf9c6 in free (/home/runner/work/cppcheck/cppcheck/cmake.output/bin/testrunner+0x48b9c6) (BuildId: 2e4e626b1c0403c69abeadd72a1feaf98331794a)
    #1 0x7f6e575e096b in std::range_error::~range_error() (/lib/x86_64-linux-gnu/libc++abi.so.1+0x2796b) (BuildId: 4a05732efb87a3a913c0757156a644bb6f99cac8)
    #2 0x7f6e575e2d33 in __cxa_end_catch (/lib/x86_64-linux-gnu/libc++abi.so.1+0x29d33) (BuildId: 4a05732efb87a3a913c0757156a644bb6f99cac8)
    #3 0x557124ce5616 in valueFlowLifetimeFunction(Token*, TokenList const&, ErrorLogger&, Settings const&) /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:1821:13
    #4 0x557124cccfb9 in valueFlowLifetime(TokenList&, ErrorLogger&, Settings const&) /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:2329:13
    #5 0x557124cc864d in ValueFlow::setValues(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, TimerResultsIntf*)::$_9::operator()(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, std::__1::set<Scope const*, std::__1::less<Scope const*>, std::__1::allocator<Scope const*>> const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:6106:9
    #6 0x557124cc864d in ValueFlowPassAdaptor<ValueFlow::setValues(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, TimerResultsIntf*)::$_9>::run(ValueFlowState const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:6042:9
    #7 0x557124d63f6c in ValueFlowPassRunner::run(ValuePtr<ValueFlowPass> const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:5970:19
    #8 0x557124cba04b in ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const::'lambda'(ValuePtr<ValueFlowPass> const&)::operator()(ValuePtr<ValueFlowPass> const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:5926:20
    #9 0x557124cba04b in bool std::__1::any_of[abi:ne190100]<ValuePtr<ValueFlowPass> const*, ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const::'lambda'(ValuePtr<ValueFlowPass> const&)>(ValuePtr<ValueFlowPass> const*, ValuePtr<ValueFlowPass> const*, ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const::'lambda'(ValuePtr<ValueFlowPass> const&)) /usr/lib/llvm-19/bin/../include/c++/v1/__algorithm/any_of.h:25:9
    #10 0x557124cba04b in ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:5925:16
    #11 0x557124cba04b in ValueFlow::setValues(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, TimerResultsIntf*) /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:6096:12
    #12 0x557124f93bf5 in Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3::operator()() const /home/runner/work/cppcheck/cppcheck/lib/tokenize.cpp:3470:13
    #13 0x557124f93bf5 in decltype(std::declval<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&>()()) std::__1::__invoke[abi:ne190100]<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&>(Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&) /usr/lib/llvm-19/bin/../include/c++/v1/__type_traits/invoke.h:149:25
    #14 0x557124f93bf5 in void std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ne190100]<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&>(Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&) /usr/lib/llvm-19/bin/../include/c++/v1/__type_traits/invoke.h:224:5
    #15 0x557124f93bf5 in std::__1::__function::__alloc_func<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3, std::__1::allocator<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3>, void ()>::operator()[abi:ne190100]() /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:171:12
    #16 0x557124f93bf5 in std::__1::__function::__func<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3, std::__1::allocator<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3>, void ()>::operator()() /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:313:10
    #17 0x557124f97d85 in std::__1::__function::__value_func<void ()>::operator()[abi:ne190100]() const /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:430:12
    #18 0x557124f97d85 in std::__1::function<void ()>::operator()() const /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:989:10
    #19 0x557124f97d85 in Timer::run(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, SHOWTIME_MODES, TimerResultsIntf*, std::__1::function<void ()> const&) /home/runner/work/cppcheck/cppcheck/lib/timer.h:85:9
    #20 0x557124e2f792 in Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /home/runner/work/cppcheck/cppcheck/lib/tokenize.cpp:3469:9
    #21 0x557123ef94b9 in bool SimpleTokenizer::tokenize<134ul>(char const (&) [134ul], bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /home/runner/work/cppcheck/cppcheck/test/helpers.h:89:16
    #22 0x557123f88305 in void TestBufferOverrun::check_<134ul>(char const*, int, char const (&) [134ul], bool) /home/runner/work/cppcheck/cppcheck/test/testbufferoverrun.cpp:49:9
    #23 0x557123f4edba in TestBufferOverrun::negativeMemoryAllocationSizeError() /home/runner/work/cppcheck/cppcheck/test/testbufferoverrun.cpp:5166:9
    #24 0x557123f205b8 in TestBufferOverrun::run() /home/runner/work/cppcheck/cppcheck/test/testbufferoverrun.cpp:300:9
    #25 0x557123e1a44e in TestFixture::run(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /home/runner/work/cppcheck/cppcheck/test/fixture.cpp:355:13
    #26 0x557123e1b332 in TestFixture::runTests(options const&) /home/runner/work/cppcheck/cppcheck/test/fixture.cpp:394:26
    #27 0x557123e2adc6 in main /home/runner/work/cppcheck/cppcheck/test/main.cpp:42:42
    #28 0x7f6e56e29d8f  (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f) (BuildId: 490fef8403240c91833978d494d39e5[374](https://github.com/danmar/cppcheck/actions/runs/10983721351/job/30493428093?pr=6820#step:12:375)09b92e)
    #29 0x7f6e56e29e3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f) (BuildId: 490fef8403240c91833978d494d39e537409b92e)
    #30 0x557123d309c4 in _start (/home/runner/work/cppcheck/cppcheck/cmake.output/bin/testrunner+0x3ec9c4) (BuildId: 2e4e626b1c0403c69abeadd72a1feaf98331794a)

0x508001cef5a0 is located 0 bytes inside of 89-byte region [0x508001cef5a0,0x508001cef5f9)
allocated by thread T0 here:
    #0 0x557123e1018d in operator new(unsigned long) (/home/runner/work/cppcheck/cppcheck/cmake.output/bin/testrunner+0x4cc18d) (BuildId: 2e4e626b1c0403c69abeadd72a1feaf98331794a)
    #1 0x7f6e5764642d in std::runtime_error::runtime_error(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) (/lib/x86_64-linux-gnu/libc++.so.1+0x5242d) (BuildId: 47b0bf2979edea765b069a035aa03cab9172a459)
    #2 0x557124ce060a in valueFlowLifetimeFunction(Token*, TokenList const&, ErrorLogger&, Settings const&) /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:1818:24
    #3 0x557124cccfb9 in valueFlowLifetime(TokenList&, ErrorLogger&, Settings const&) /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:2329:13
    #4 0x557124cc864d in ValueFlow::setValues(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, TimerResultsIntf*)::$_9::operator()(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, std::__1::set<Scope const*, std::__1::less<Scope const*>, std::__1::allocator<Scope const*>> const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:6106:9
    #5 0x557124cc864d in ValueFlowPassAdaptor<ValueFlow::setValues(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, TimerResultsIntf*)::$_9>::run(ValueFlowState const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:6042:9
    #6 0x557124d63f6c in ValueFlowPassRunner::run(ValuePtr<ValueFlowPass> const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:5970:19
    #7 0x557124cba04b in ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const::'lambda'(ValuePtr<ValueFlowPass> const&)::operator()(ValuePtr<ValueFlowPass> const&) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:5926:20
    #8 0x557124cba04b in bool std::__1::any_of[abi:ne190100]<ValuePtr<ValueFlowPass> const*, ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const::'lambda'(ValuePtr<ValueFlowPass> const&)>(ValuePtr<ValueFlowPass> const*, ValuePtr<ValueFlowPass> const*, ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const::'lambda'(ValuePtr<ValueFlowPass> const&)) /usr/lib/llvm-19/bin/../include/c++/v1/__algorithm/any_of.h:25:9
    #9 0x557124cba04b in ValueFlowPassRunner::run_once(std::initializer_list<ValuePtr<ValueFlowPass>>) const /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:5925:16
    #10 0x557124cba04b in ValueFlow::setValues(TokenList&, SymbolDatabase&, ErrorLogger&, Settings const&, TimerResultsIntf*) /home/runner/work/cppcheck/cppcheck/lib/valueflow.cpp:6096:12
    #11 0x557124f93bf5 in Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3::operator()() const /home/runner/work/cppcheck/cppcheck/lib/tokenize.cpp:3470:13
    #12 0x557124f93bf5 in decltype(std::declval<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&>()()) std::__1::__invoke[abi:ne190100]<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&>(Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&) /usr/lib/llvm-19/bin/../include/c++/v1/__type_traits/invoke.h:149:25
    #13 0x557124f93bf5 in void std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ne190100]<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&>(Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3&) /usr/lib/llvm-19/bin/../include/c++/v1/__type_traits/invoke.h:224:5
    #14 0x557124f93bf5 in std::__1::__function::__alloc_func<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3, std::__1::allocator<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3>, void ()>::operator()[abi:ne190100]() /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:171:12
    #15 0x557124f93bf5 in std::__1::__function::__func<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3, std::__1::allocator<Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)::$_3>, void ()>::operator()() /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:313:10
    #16 0x557124f97d85 in std::__1::__function::__value_func<void ()>::operator()[abi:ne190100]() const /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:430:12
    #17 0x557124f97d85 in std::__1::function<void ()>::operator()() const /usr/lib/llvm-19/bin/../include/c++/v1/__functional/function.h:989:10
    #18 0x557124f97d85 in Timer::run(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, SHOWTIME_MODES, TimerResultsIntf*, std::__1::function<void ()> const&) /home/runner/work/cppcheck/cppcheck/lib/timer.h:85:9
    #19 0x557124e2f792 in Tokenizer::simplifyTokens1(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /home/runner/work/cppcheck/cppcheck/lib/tokenize.cpp:3469:9
    #20 0x557123ef94b9 in bool SimpleTokenizer::tokenize<134ul>(char const (&) [134ul], bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /home/runner/work/cppcheck/cppcheck/test/helpers.h:89:16
    #21 0x557123f88305 in void TestBufferOverrun::check_<134ul>(char const*, int, char const (&) [134ul], bool) /home/runner/work/cppcheck/cppcheck/test/testbufferoverrun.cpp:49:9
    #22 0x557123f4edba in TestBufferOverrun::negativeMemoryAllocationSizeError() /home/runner/work/cppcheck/cppcheck/test/testbufferoverrun.cpp:5166:9
    #23 0x557123f205b8 in TestBufferOverrun::run() /home/runner/work/cppcheck/cppcheck/test/testbufferoverrun.cpp:300:9
    #24 0x557123e1a44e in TestFixture::run(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) /home/runner/work/cppcheck/cppcheck/test/fixture.cpp:355:13
    #25 0x557123e1b332 in TestFixture::runTests(options const&) /home/runner/work/cppcheck/cppcheck/test/fixture.cpp:[394](https://github.com/danmar/cppcheck/actions/runs/10983721351/job/30493428093?pr=6820#step:12:395):26
    #26 0x557123e2adc6 in main /home/runner/work/cppcheck/cppcheck/test/main.cpp:42:42
    #27 0x7f6e56e29d8f  (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f) (BuildId: 490fef8403240c91833978d494d39e537409b92e)

SUMMARY: AddressSanitizer: alloc-dealloc-mismatch (/home/runner/work/cppcheck/cppcheck/cmake.output/bin/testrunner+0x48b9c6) (BuildId: 2e4e626b1c0403c69abeadd72a1feaf98331794a) in free

See https://github.com/llvm/llvm-project/issues/59432.

firewave avatar Sep 22 '24 19:09 firewave

/home/runner/work/cppcheck/cppcheck/externals/tinyxml2/tinyxml2.cpp:613:48: warning: format specifies type 'unsigned long long' but the argument has type 'long long' [-Wformat]
  613 |     TIXML_SNPRINTF(buffer, bufferSize, "%llu", (long long)v);
      |                                         ~~~~   ^~~~~~~~~~~~
      |                                         %lld
/home/runner/work/cppcheck/cppcheck/externals/tinyxml2/tinyxml2.cpp:[25](https://github.com/danmar/cppcheck/actions/runs/10983721351/job/30493428093?pr=6820#step:10:26)21:120: warning: format specifies type 'unsigned int' but the argument has type 'int' [-Wformat]
 2521 |     TIXML_SNPRINTF(buffer, BUFFER_SIZE, "Error=%s ErrorID=%d (0x%x) Line number=%d", ErrorIDToName(error), int(error), int(error), lineNum);
      |                                                                 ~~                                                     ^~~~~~~~~~
      |                                                                 %x
/home/runner/work/cppcheck/cppcheck/externals/picojson/picojson.h:549:47: warning: format specifies type 'unsigned int' but the argument has type 'int' [-Wformat]
  549 |         SNPRINTF(buf, sizeof(buf), "\\u%04x", c & 0xff);
      |                                        ~~~~   ^~~~~~~~
      |                                        %04x
/usr/lib/llvm-19/bin/../include/c++/v1/__algorithm/for_each.h:34:5: note: in instantiation of member function 'picojson::serialize_str_char<std::ostream_iterator<char>>::operator()' requested here
   34 |     __f(*__first);
      |     ^
/home/runner/work/cppcheck/cppcheck/externals/picojson/picojson.h:562:8: note: in instantiation of function template specialization 'std::for_each<std::__wrap_iter<const char *>, picojson::serialize_str_char<std::ostream_iterator<char>>>' requested here
  562 |   std::for_each(s.begin(), s.end(), process_char);
      |        ^
/home/runner/work/cppcheck/cppcheck/externals/picojson/picojson.h:584:5: note: in instantiation of function template specialization 'picojson::serialize_str<std::ostream_iterator<char>>' requested here
  584 |     serialize_str(*u_.string_, oi);
      |     ^
/home/runner/work/cppcheck/cppcheck/externals/picojson/picojson.h:567:10: note: in instantiation of function template specialization 'picojson::value::_serialize<std::ostream_iterator<char>>' requested here
  567 |   return _serialize(oi, prettify ? 0 : -1);
      |          ^
/home/runner/work/cppcheck/cppcheck/externals/picojson/picojson.h:1193:5: note: in instantiation of function template specialization 'picojson::value::serialize<std::ostream_iterator<char>>' requested here
 1193 |   x.serialize(std::ostream_iterator<char>(os));
      |     ^

These -Wformat warnings are strangely not reported by clang-tidy. I have encountered them locally though.

firewave avatar Sep 22 '24 19:09 firewave

The alloc-dealloc-mismatch ASAN error has been fixed upstream.

firewave avatar Dec 20 '24 21:12 firewave