diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-01-29 02:40:24 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-01-29 02:40:24 +0000 |
commit | 26ac2e07b46bfb4d4f00752c96481c0a98c79c69 (patch) | |
tree | bed4398bf05a6886cb93ab9fa70f66e0f3c1848e /lib/Sema/SemaChecking.cpp | |
parent | eb60edffa147e061278c436e513b0df9b4c4e7f6 (diff) |
Alternate format string checking: issue a warning for invalid conversion specifiers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94792 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 3cd45a23d7..a6d5097598 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -1306,7 +1306,16 @@ public: TheCall(theCall), FormatIdx(formatIdx) {} void DoneProcessing(); - + +// void HandleIncompleteFormatSpecifier(const char *startSpecifier, +// const char *endSpecifier); + +// void HandleIncompletePrecision(const char *periodChar); + + void HandleInvalidConversionSpecifier(const analyze_printf::FormatSpecifier &FS, + const char *startSpecifier, + unsigned specifierLen); + void HandleNullChar(const char *nullCharacter); bool HandleFormatSpecifier(const analyze_printf::FormatSpecifier &FS, @@ -1331,6 +1340,20 @@ SourceLocation CheckPrintfHandler::getLocationOfByte(const char *x) { return S.getLocationOfStringLiteralByte(FExpr, x - Beg); } +void CheckPrintfHandler:: +HandleInvalidConversionSpecifier(const analyze_printf::FormatSpecifier &FS, + const char *startSpecifier, + unsigned specifierLen) { + + ++NumConversions; + + SourceLocation Loc = + getLocationOfByte(FS.getConversionSpecifier().getStart()); + S.Diag(Loc, diag::warn_printf_invalid_conversion) + << llvm::StringRef(startSpecifier, specifierLen) + << getFormatRange(); +} + void CheckPrintfHandler::HandleNullChar(const char *nullCharacter) { // The presence of a null character is likely an error. S.Diag(getLocationOfByte(nullCharacter), @@ -1373,7 +1396,6 @@ CheckPrintfHandler::HandleAmount(const analyze_printf::OptionalAmount &Amt, } return true; } - bool CheckPrintfHandler::HandleFormatSpecifier(const analyze_printf::FormatSpecifier &FS, @@ -1397,20 +1419,17 @@ CheckPrintfHandler::HandleFormatSpecifier(const analyze_printf::FormatSpecifier return false; } - ++NumConversions; - // Check for using an Objective-C specific conversion specifier // in a non-ObjC literal. if (!IsObjCLiteral && CS.isObjCArg()) { - SourceLocation Loc = getLocationOfByte(CS.getStart()); - S.Diag(Loc, diag::warn_printf_invalid_conversion) - << llvm::StringRef(startSpecifier, specifierLen) - << getFormatRange(); + HandleInvalidConversionSpecifier(FS, startSpecifier, specifierLen); // Continue checking the other format specifiers. return true; } + ++NumConversions; + // Are we using '%n'? Issue a warning about this being // a possible security issue. if (CS.getKind() == ConversionSpecifier::OutIntPtrArg) { |