use libc++ in conjunction with Clang in CI
It provides additional annotations for the compiler and the sanitizers to detect more issues.
[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.
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.
/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.
The alloc-dealloc-mismatch ASAN error has been fixed upstream.
Quality Gate passed
Issues
0 New issues
0 Accepted issues
Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code
Quality Gate passed
Issues
0 New issues
0 Accepted issues
Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code
Quality Gate passed
Issues
0 New issues
0 Accepted issues
Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code