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
This commit is contained in:
Ted Kremenek 2010-02-27 08:34:51 +00:00
Родитель dab10acd56
Коммит e3fc547902
3 изменённых файлов: 12 добавлений и 1 удалений

Просмотреть файл

@ -1283,7 +1283,12 @@ CheckPrintfHandler::HandleFormatSpecifier(const analyze_printf::FormatSpecifier
// Consume the argument. // Consume the argument.
unsigned argIndex = FS.getArgIndex(); unsigned argIndex = FS.getArgIndex();
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); CoveredArgs.set(argIndex);
}
// Check for using an Objective-C specific conversion specifier // Check for using an Objective-C specific conversion specifier
// in a non-ObjC literal. // in a non-ObjC literal.

Просмотреть файл

@ -145,6 +145,7 @@ void torture(va_list v8) {
} }
void test10(int x, float f, int i, long long lli) { 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("%@", 12); // expected-warning{{invalid conversion specifier '@'}}
printf("\0"); // expected-warning{{format string contains '\0' within the string body}} 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}} printf("xs\0"); // expected-warning{{format string contains '\0' within the string body}}

Просмотреть файл

@ -50,3 +50,8 @@ void rdar_7068334() {
printf("%i ",test); // expected-warning{{conversion specifies type 'int' but the argument has type 'long long'}} 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'}} NSLog(@"%i ",test); // expected-warning{{conversion specifies type 'int' but the argument has type 'long long'}}
} }
// <rdar://problem/7697748>
void rdar_7697748() {
NSLog(@"%@!"); // expected-warning{{more '%' conversions than data arguments}}
}