Skip to content

Commit a48c8ab

Browse files
rikardfalkeborndanmar
authored andcommitted
Fix 8124: False positive va_end missing with lambda (cppcheck-opensource#1577)
Skip lambdas, to avoid false positives due to possible return statements in lambdas. Also, run dmake.
1 parent d3a10d3 commit a48c8ab

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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

lib/checkvaarg.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
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());

test/testvaarg.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff 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() {

0 commit comments

Comments
 (0)