diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-01-28 02:46:17 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-01-28 02:46:17 +0000 |
commit | a8d8fec7876666d90bb2a144d3b832b2d89a088a (patch) | |
tree | e744829211dcd20f9af0c0d61a8b624919a6c45d /lib/Analysis/PrintfFormatString.cpp | |
parent | d2dcece5882215e92a80bff8a7b7fd2fd81d7086 (diff) |
Add position of conversion specifier character to 'ConversionSpecifier'.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94739 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/PrintfFormatString.cpp')
-rw-r--r-- | lib/Analysis/PrintfFormatString.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/lib/Analysis/PrintfFormatString.cpp b/lib/Analysis/PrintfFormatString.cpp index 81752e9c4c..544956ac41 100644 --- a/lib/Analysis/PrintfFormatString.cpp +++ b/lib/Analysis/PrintfFormatString.cpp @@ -189,39 +189,42 @@ static FormatSpecifierResult ParseFormatSpecifier(FormatStringHandler &H, } // Finally, look for the conversion specifier. - ConversionSpecifier::Kind cs; - switch (*I) { + const char *conversionPosition = I++; + ConversionSpecifier::Kind k; + switch (*conversionPosition) { default: - H.HandleInvalidConversionSpecifier(I); + H.HandleInvalidConversionSpecifier(conversionPosition); return true; // C99: 7.19.6.1 (section 8). - case 'd': cs = ConversionSpecifier::dArg; break; - case 'i': cs = ConversionSpecifier::iArg; break; - case 'o': cs = ConversionSpecifier::oArg; break; - case 'u': cs = ConversionSpecifier::uArg; break; - case 'x': cs = ConversionSpecifier::xArg; break; - case 'X': cs = ConversionSpecifier::XArg; break; - case 'f': cs = ConversionSpecifier::fArg; break; - case 'F': cs = ConversionSpecifier::FArg; break; - case 'e': cs = ConversionSpecifier::eArg; break; - case 'E': cs = ConversionSpecifier::EArg; break; - case 'g': cs = ConversionSpecifier::gArg; break; - case 'G': cs = ConversionSpecifier::GArg; break; - case 'a': cs = ConversionSpecifier::aArg; break; - case 'A': cs = ConversionSpecifier::AArg; break; - case 'c': cs = ConversionSpecifier::IntAsCharArg; break; - case 's': cs = ConversionSpecifier::CStrArg; break; - case 'p': cs = ConversionSpecifier::VoidPtrArg; break; - case 'n': cs = ConversionSpecifier::OutIntPtrArg; break; - case '%': cs = ConversionSpecifier::PercentArg; break; + case 'd': k = ConversionSpecifier::dArg; break; + case 'i': k = ConversionSpecifier::iArg; break; + case 'o': k = ConversionSpecifier::oArg; break; + case 'u': k = ConversionSpecifier::uArg; break; + case 'x': k = ConversionSpecifier::xArg; break; + case 'X': k = ConversionSpecifier::XArg; break; + case 'f': k = ConversionSpecifier::fArg; break; + case 'F': k = ConversionSpecifier::FArg; break; + case 'e': k = ConversionSpecifier::eArg; break; + case 'E': k = ConversionSpecifier::EArg; break; + case 'g': k = ConversionSpecifier::gArg; break; + case 'G': k = ConversionSpecifier::GArg; break; + case 'a': k = ConversionSpecifier::aArg; break; + case 'A': k = ConversionSpecifier::AArg; break; + case 'c': k = ConversionSpecifier::IntAsCharArg; break; + case 's': k = ConversionSpecifier::CStrArg; break; + case 'p': k = ConversionSpecifier::VoidPtrArg; break; + case 'n': k = ConversionSpecifier::OutIntPtrArg; break; + case '%': k = ConversionSpecifier::PercentArg; break; // Objective-C. - case '@': cs = ConversionSpecifier::ObjCObjArg; break; + case '@': k = ConversionSpecifier::ObjCObjArg; break; } - FS.setConversionSpecifier(cs); + FS.setConversionSpecifier(ConversionSpecifier(conversionPosition, k)); return FormatSpecifierResult(Start, FS); } -bool ParseFormatSring(FormatStringHandler &H, const char *I, const char *E) { +namespace clang { namespace analyze_printf { +bool ParseFormatString(FormatStringHandler &H, + const char *I, const char *E) { // Keep looking for a format specifier until we have exhausted the string. while (I != E) { const FormatSpecifierResult &FSR = ParseFormatSpecifier(H, I, E); @@ -233,11 +236,13 @@ bool ParseFormatSring(FormatStringHandler &H, const char *I, const char *E) { if (!FSR.hasValue()) break; // We have a format specifier. Pass it to the callback. - if (!H.HandleFormatSpecifier(FSR.getValue(), FSR.getStart(), I)) + if (!H.HandleFormatSpecifier(FSR.getValue(), FSR.getStart(), + I - FSR.getStart())) return false; } assert(I == E && "Format string not exhausted"); return false; } +}} FormatStringHandler::~FormatStringHandler() {} |