File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -430,7 +430,7 @@ $(SRCDIR)/checkunusedfunctions.o: lib/checkunusedfunctions.cpp lib/checkunusedfu
430430$(SRCDIR ) /checkunusedvar.o : lib/checkunusedvar.cpp lib/checkunusedvar.h lib/check.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/settings.h lib/importproject.h lib/platform.h lib/utils.h lib/library.h lib/mathlib.h lib/standards.h lib/timer.h lib/token.h lib/valueflow.h lib/templatesimplifier.h lib/tokenize.h lib/tokenlist.h lib/astutils.h lib/symboldatabase.h
431431 $(CXX ) ${INCLUDE_FOR_LIB} $(CPPFLAGS ) $(CFG ) $(CXXFLAGS ) $(UNDEF_STRICT_ANSI ) -c -o $(SRCDIR ) /checkunusedvar.o $(SRCDIR ) /checkunusedvar.cpp
432432
433- $(SRCDIR ) /checkvaarg.o : lib/checkvaarg.cpp lib/checkvaarg.h lib/check.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/settings.h lib/importproject.h lib/platform.h lib/utils.h lib/library.h lib/mathlib.h lib/standards.h lib/timer.h lib/token.h lib/valueflow.h lib/templatesimplifier.h lib/tokenize.h lib/tokenlist.h lib/symboldatabase.h
433+ $(SRCDIR ) /checkvaarg.o : lib/checkvaarg.cpp lib/checkvaarg.h lib/check.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/settings.h lib/importproject.h lib/platform.h lib/utils.h lib/library.h lib/mathlib.h lib/standards.h lib/timer.h lib/token.h lib/valueflow.h lib/templatesimplifier.h lib/tokenize.h lib/tokenlist.h lib/astutils.h lib/ symboldatabase.h
434434 $(CXX ) ${INCLUDE_FOR_LIB} $(CPPFLAGS ) $(CFG ) $(CXXFLAGS ) $(UNDEF_STRICT_ANSI ) -c -o $(SRCDIR ) /checkvaarg.o $(SRCDIR ) /checkvaarg.cpp
435435
436436$(SRCDIR ) /cppcheck.o : lib/cppcheck.cpp lib/cppcheck.h lib/analyzerinfo.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/importproject.h lib/platform.h lib/utils.h lib/check.h lib/settings.h lib/library.h lib/mathlib.h lib/standards.h lib/timer.h lib/token.h lib/valueflow.h lib/templatesimplifier.h lib/tokenize.h lib/tokenlist.h lib/checkunusedfunctions.h lib/ctu.h lib/path.h lib/preprocessor.h lib/version.h
Original file line number Diff line number Diff line change 1818
1919#include " checkvaarg.h"
2020
21+ #include " astutils.h"
2122#include " errorlogger.h"
2223#include " settings.h"
2324#include " symboldatabase.h"
@@ -107,6 +108,10 @@ void CheckVaarg::va_list_usage()
107108
108109 const Token* tok = var->nameToken ()->next ();
109110 for (; tok && tok != var->scope ()->bodyEnd ; tok = tok->next ()) {
111+ // Skip lambdas
112+ const Token* tok2 = findLambdaEndToken (tok);
113+ if (tok2)
114+ tok = tok2;
110115 if (Token::Match (tok, " va_start ( %varid%" , var->declarationId ())) {
111116 if (open)
112117 va_start_subsequentCallsError (tok, var->name ());
Original file line number Diff line number Diff line change @@ -155,6 +155,32 @@ class TestVaarg : public TestFixture {
155155 " va_end(arg_ptr);\n "
156156 " }" );
157157 ASSERT_EQUALS (" [test.cpp:4]: (error) va_list 'arg_ptr' was opened but not closed by va_end().\n " , errout.str ());
158+
159+ // #8124
160+ check (" void f(int n, ...)\n "
161+ " {\n "
162+ " va_list ap;\n "
163+ " va_start(ap, n);\n "
164+ " std::vector<std::string> v(n);\n "
165+ " std::generate_n(v.begin(), n, [&ap]()\n "
166+ " {\n "
167+ " return va_arg(ap, const char*);\n "
168+ " });\n "
169+ " va_end(ap);\n "
170+ " }\n " );
171+ ASSERT_EQUALS (" " , errout.str ());
172+
173+ check (" void f(int n, ...)\n "
174+ " {\n "
175+ " va_list ap;\n "
176+ " va_start(ap, n);\n "
177+ " std::vector<std::string> v(n);\n "
178+ " std::generate_n(v.begin(), n, [&ap]()\n "
179+ " {\n "
180+ " return va_arg(ap, const char*);\n "
181+ " });\n "
182+ " }\n " );
183+ ASSERT_EQUALS (" [test.cpp:10]: (error) va_list 'ap' was opened but not closed by va_end().\n " , errout.str ());
158184 }
159185
160186 void va_list_usedBeforeStarted () {
You can’t perform that action at this time.
0 commit comments