cppcheck icon indicating copy to clipboard operation
cppcheck copied to clipboard

template-ized `Timer::run()`

Open firewave opened this issue 4 weeks ago • 2 comments

firewave avatar Dec 13 '25 03:12 firewave

This provides a cleaner callstack as a std::function object is never created.

Before:

#2 0x557f52ae1bb9 in CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0::operator()() const /home/user/CLionProjects/cppcheck/lib/cppcheck.cpp:1356:24
#3 0x557f52ae19fc in void std::__invoke_impl<void, CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0&>(std::__invoke_other, CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../include/c++/15.2.1/bits/invoke.h:63:14
#4 0x557f52ae18fc in std::enable_if<is_invocable_r_v<void, CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0&>, void>::type std::__invoke_r<void, CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0&>(CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../include/c++/15.2.1/bits/invoke.h:113:2
#5 0x557f52ae14f4 in std::_Function_handler<void (), CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0>::_M_invoke(std::_Any_data const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../include/c++/15.2.1/bits/std_function.h:292:9
#6 0x557f521f2e4d in std::function<void ()>::operator()() const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../include/c++/15.2.1/bits/std_function.h:593:9
#7 0x557f521c5e91 in Timer::run(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, ShowTime, TimerResultsIntf*, std::function<void ()> const&) /home/user/CLionProjects/cppcheck/lib/timer.h:96:9
#8 0x557f52aa643f in CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) /home/user/CLionProjects/cppcheck/lib/cppcheck.cpp:1355:13

After:

#2 0x5590d11f66e9 in CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0::operator()() const /home/user/CLionProjects/cppcheck/lib/cppcheck.cpp:1356:24
#3 0x5590d11de5f1 in void Timer::run<CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, ShowTime, TimerResultsIntf*, CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0 const&) /home/user/CLionProjects/cppcheck/lib/timer.h:97:9
#4 0x5590d11bd84c in CppCheck::checkNormalTokens(Tokenizer const&, AnalyzerInformation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) /home/user/CLionProjects/cppcheck/lib/cppcheck.cpp:1355:13

I filed https://trac.cppcheck.net/ticket/14327 about suggesting this ourselves.

firewave avatar Dec 13 '25 03:12 firewave

The problem is you throw away type safety. Concepts should be used to get sensible compiler error output. I have no idea what concepts to use here.

danmar avatar Dec 15 '25 09:12 danmar

The problem is you throw away type safety. Concepts should be used to get sensible compiler error output. I have no idea what concepts to use here.

That could be addressed by adding a REQUIRES but we are not doing that in other places. I might take a look at this later.

firewave avatar Dec 15 '25 11:12 firewave