Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use libc++ in conjunction with Clang in CI #6820

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

firewave
Copy link
Collaborator

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

@firewave
Copy link
Collaborator Author

firewave commented Sep 22, 2024

[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: llvm/llvm-project#109587.

@firewave
Copy link
Collaborator Author

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 llvm/llvm-project#59432.

@firewave
Copy link
Collaborator Author

/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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant