From ec01cc811edbbe9629a40c35d6eca477e8c0c508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 23 Sep 2012 13:25:28 +0200 Subject: [PATCH] Second fix for #4207 (Internal error. Token::Match called with varid 0) --- lib/checkbufferoverrun.cpp | 6 ++++-- test/testbufferoverrun.cpp | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index a21b5a135..b10a631a6 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -605,8 +605,10 @@ void CheckBufferOverrun::checkFunctionParameter(const Token &tok, unsigned int p if (!parameter || _tokenizer->sizeOfType(parameter->typeStartToken()) != arrayInfo.element_size()) return; - // Variable function arguments.. - if (Token::simpleMatch(parameter->typeStartToken(), ". . .")) + // No variable id occur for instance when: + // - Variable function arguments: "void f(...)" + // - Unnamed parameter: "void f(char *)" + if (parameter->varId() == 0) return; // Check the parameter usage in the function scope.. diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 95b10eb10..cd109958f 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -1453,7 +1453,8 @@ private: ASSERT_EQUALS("", errout.str()); } - void array_index_45() { // #4207 - handling of function with variable number of parameters + void array_index_45() { // #4207 - handling of function with variable number of parameters / unnamed arguments + // Variable number of arguments check("void f(const char *format, ...) {\n" " va_args args;\n" " va_start(args, format);\n" @@ -1463,6 +1464,16 @@ private: " f(\"%s\", buffer);\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + // Unnamed argument + check("void f(char *) {\n" + " dostuff();\n" + "}\n" + "void test() {\n" + " char buffer[1024];\n" + " f(buffer);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void array_index_multidim() {