From: Ted Kremenek Date: Sat, 27 Feb 2010 08:34:51 +0000 (+0000) Subject: Fix crasher caused by setting a bit in a possibly empty bitvector while X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e3fc54790250076e33ad25b14e5be293514fe5ea;p=clang Fix crasher caused by setting a bit in a possibly empty bitvector while doing printf format string checking. This is a recent regression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97318 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 7198dad533..c7b9cb7b9b 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -1283,7 +1283,12 @@ CheckPrintfHandler::HandleFormatSpecifier(const analyze_printf::FormatSpecifier // Consume the argument. unsigned argIndex = FS.getArgIndex(); - CoveredArgs.set(argIndex); + if (argIndex < NumDataArgs) { + // The check to see if the argIndex is valid will come later. + // We set the bit here because we may exit early from this + // function if we encounter some other error. + CoveredArgs.set(argIndex); + } // Check for using an Objective-C specific conversion specifier // in a non-ObjC literal. diff --git a/test/Sema/format-strings.c b/test/Sema/format-strings.c index e92e17da08..21d3aec840 100644 --- a/test/Sema/format-strings.c +++ b/test/Sema/format-strings.c @@ -145,6 +145,7 @@ void torture(va_list v8) { } void test10(int x, float f, int i, long long lli) { + printf("%s"); // expected-warning{{more '%' conversions than data arguments}} printf("%@", 12); // expected-warning{{invalid conversion specifier '@'}} printf("\0"); // expected-warning{{format string contains '\0' within the string body}} printf("xs\0"); // expected-warning{{format string contains '\0' within the string body}} diff --git a/test/SemaObjC/format-strings-objc.m b/test/SemaObjC/format-strings-objc.m index 7abfe96223..1fcc34f695 100644 --- a/test/SemaObjC/format-strings-objc.m +++ b/test/SemaObjC/format-strings-objc.m @@ -50,3 +50,8 @@ void rdar_7068334() { printf("%i ",test); // expected-warning{{conversion specifies type 'int' but the argument has type 'long long'}} NSLog(@"%i ",test); // expected-warning{{conversion specifies type 'int' but the argument has type 'long long'}} } + +// +void rdar_7697748() { + NSLog(@"%@!"); // expected-warning{{more '%' conversions than data arguments}} +}