diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-07-19 22:01:06 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-07-19 22:01:06 +0000 |
commit | 6cd694233dae8e8604b4ebfedb2cb9f9d1d90111 (patch) | |
tree | 22e7b0f7d787f9b85afe8b60ff090fc301346c28 /clang/lib | |
parent | aa21cc401b001b67b234c8dc2edaad1fd3210040 (diff) | |
download | bcm5719-llvm-6cd694233dae8e8604b4ebfedb2cb9f9d1d90111.tar.gz bcm5719-llvm-6cd694233dae8e8604b4ebfedb2cb9f9d1d90111.zip |
Don't warn when a '%%' or '%*d' (scanf) is used in a format string with positional arguments, since
these don't actually consume an argument.
llvm-svn: 108757
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index f36a9ed9386..72939e6e592 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -1434,16 +1434,18 @@ CheckPrintfHandler::HandlePrintfSpecifier(const analyze_printf::PrintfSpecifier using namespace analyze_printf; const ConversionSpecifier &CS = FS.getConversionSpecifier(); - if (atFirstArg) { - atFirstArg = false; - usesPositionalArgs = FS.usesPositionalArg(); - } - else if (usesPositionalArgs != FS.usesPositionalArg()) { - // Cannot mix-and-match positional and non-positional arguments. - S.Diag(getLocationOfByte(CS.getStart()), - diag::warn_format_mix_positional_nonpositional_args) - << getSpecifierRange(startSpecifier, specifierLen); - return false; + if (FS.consumesDataArgument()) { + if (atFirstArg) { + atFirstArg = false; + usesPositionalArgs = FS.usesPositionalArg(); + } + else if (usesPositionalArgs != FS.usesPositionalArg()) { + // Cannot mix-and-match positional and non-positional arguments. + S.Diag(getLocationOfByte(CS.getStart()), + diag::warn_format_mix_positional_nonpositional_args) + << getSpecifierRange(startSpecifier, specifierLen); + return false; + } } // First check if the field width, precision, and conversion specifier @@ -1653,18 +1655,20 @@ bool CheckScanfHandler::HandleScanfSpecifier( const ConversionSpecifier &CS = FS.getConversionSpecifier(); - // FIXME: Handle case where '%' and '*' don't consume an argument. - // This needs to be done for the printf case as well. - if (atFirstArg) { - atFirstArg = false; - usesPositionalArgs = FS.usesPositionalArg(); - } - else if (usesPositionalArgs != FS.usesPositionalArg()) { - // Cannot mix-and-match positional and non-positional arguments. - S.Diag(getLocationOfByte(CS.getStart()), - diag::warn_format_mix_positional_nonpositional_args) - << getSpecifierRange(startSpecifier, specifierLen); - return false; + // Handle case where '%' and '*' don't consume an argument. These shouldn't + // be used to decide if we are using positional arguments consistently. + if (FS.consumesDataArgument()) { + if (atFirstArg) { + atFirstArg = false; + usesPositionalArgs = FS.usesPositionalArg(); + } + else if (usesPositionalArgs != FS.usesPositionalArg()) { + // Cannot mix-and-match positional and non-positional arguments. + S.Diag(getLocationOfByte(CS.getStart()), + diag::warn_format_mix_positional_nonpositional_args) + << getSpecifierRange(startSpecifier, specifierLen); + return false; + } } // Check if the field with is non-zero. |