Format string errors should underling the format string, not the function name.

llvm-svn: 54067
This commit is contained in:
Ted Kremenek 2008-07-25 22:03:03 +00:00
parent 3f375d055e
commit 870f750434
1 changed files with 15 additions and 12 deletions

View File

@ -454,14 +454,16 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
return; return;
Diag(TheCall->getArg(format_idx)->getLocStart(), Diag(TheCall->getArg(format_idx)->getLocStart(),
diag::warn_printf_not_string_constant, Fn->getSourceRange()); diag::warn_printf_not_string_constant,
OrigFormatExpr->getSourceRange());
return; return;
} }
// CHECK: is the format string a wide literal? // CHECK: is the format string a wide literal?
if (FExpr->isWide()) { if (FExpr->isWide()) {
Diag(FExpr->getLocStart(), Diag(FExpr->getLocStart(),
diag::warn_printf_format_string_is_wide_literal, Fn->getSourceRange()); diag::warn_printf_format_string_is_wide_literal,
OrigFormatExpr->getSourceRange());
return; return;
} }
@ -473,7 +475,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
if (StrLen == 0) { if (StrLen == 0) {
Diag(FExpr->getLocStart(), diag::warn_printf_empty_format_string, Diag(FExpr->getLocStart(), diag::warn_printf_empty_format_string,
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
return; return;
} }
@ -513,7 +515,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
// so the presence of a null character is likely an error. // so the presence of a null character is likely an error.
Diag(PP.AdvanceToTokenCharacter(FExpr->getLocStart(), StrIdx+1), Diag(PP.AdvanceToTokenCharacter(FExpr->getLocStart(), StrIdx+1),
diag::warn_printf_format_string_contains_null_char, diag::warn_printf_format_string_contains_null_char,
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
return; return;
} }
@ -538,10 +540,10 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
if (Str[StrIdx-1] == '.') if (Str[StrIdx-1] == '.')
Diag(Loc, diag::warn_printf_asterisk_precision_missing_arg, Diag(Loc, diag::warn_printf_asterisk_precision_missing_arg,
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
else else
Diag(Loc, diag::warn_printf_asterisk_width_missing_arg, Diag(Loc, diag::warn_printf_asterisk_width_missing_arg,
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
// Don't do any more checking. We'll just emit spurious errors. // Don't do any more checking. We'll just emit spurious errors.
return; return;
@ -604,7 +606,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
SourceLocation Loc = PP.AdvanceToTokenCharacter(FExpr->getLocStart(), SourceLocation Loc = PP.AdvanceToTokenCharacter(FExpr->getLocStart(),
LastConversionIdx+1); LastConversionIdx+1);
Diag(Loc, diag::warn_printf_write_back, Fn->getSourceRange()); Diag(Loc, diag::warn_printf_write_back, OrigFormatExpr->getSourceRange());
break; break;
} }
@ -621,7 +623,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
Diag(Loc, diag::warn_printf_invalid_conversion, Diag(Loc, diag::warn_printf_invalid_conversion,
std::string(Str+LastConversionIdx, std::string(Str+LastConversionIdx,
Str+std::min(LastConversionIdx+2, StrLen)), Str+std::min(LastConversionIdx+2, StrLen)),
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
} }
++numConversions; ++numConversions;
break; break;
@ -641,7 +643,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
Diag(Loc, diag::warn_printf_invalid_conversion, Diag(Loc, diag::warn_printf_invalid_conversion,
std::string(Str+LastConversionIdx, Str+StrIdx), std::string(Str+LastConversionIdx, Str+StrIdx),
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
// This conversion is broken. Advance to the next format // This conversion is broken. Advance to the next format
// conversion. // conversion.
@ -665,7 +667,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
Diag(Loc, diag::warn_printf_invalid_conversion, Diag(Loc, diag::warn_printf_invalid_conversion,
std::string(Str+LastConversionIdx, std::string(Str+LastConversionIdx,
Str+std::min(LastConversionIdx+2, StrLen)), Str+std::min(LastConversionIdx+2, StrLen)),
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
return; return;
} }
@ -677,13 +679,14 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
LastConversionIdx); LastConversionIdx);
Diag(Loc, diag::warn_printf_insufficient_data_args, Diag(Loc, diag::warn_printf_insufficient_data_args,
Fn->getSourceRange()); OrigFormatExpr->getSourceRange());
} }
// CHECK: Does the number of data arguments exceed the number of // CHECK: Does the number of data arguments exceed the number of
// format conversions in the format string? // format conversions in the format string?
else if (numConversions < numDataArgs) else if (numConversions < numDataArgs)
Diag(TheCall->getArg(format_idx+numConversions+1)->getLocStart(), Diag(TheCall->getArg(format_idx+numConversions+1)->getLocStart(),
diag::warn_printf_too_many_data_args, Fn->getSourceRange()); diag::warn_printf_too_many_data_args,
OrigFormatExpr->getSourceRange());
} }
} }