[cfe-commits] r94739 - in /cfe/trunk: include/clang/Analysis/Analyses/PrintfFormatString.h lib/Analysis/PrintfFormatString.cpp
Ted Kremenek
kremenek at apple.com
Wed Jan 27 18:46:17 PST 2010
Author: kremenek
Date: Wed Jan 27 20:46:17 2010
New Revision: 94739
URL: http://llvm.org/viewvc/llvm-project?rev=94739&view=rev
Log:
Add position of conversion specifier character to 'ConversionSpecifier'.
Modified:
cfe/trunk/include/clang/Analysis/Analyses/PrintfFormatString.h
cfe/trunk/lib/Analysis/PrintfFormatString.cpp
Modified: cfe/trunk/include/clang/Analysis/Analyses/PrintfFormatString.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/PrintfFormatString.h?rev=94739&r1=94738&r2=94739&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/Analyses/PrintfFormatString.h (original)
+++ cfe/trunk/include/clang/Analysis/Analyses/PrintfFormatString.h Wed Jan 27 20:46:17 2010
@@ -59,7 +59,15 @@
ObjCEnd = ObjCObjArg
};
- ConversionSpecifier(Kind k) : kind(k) {}
+ ConversionSpecifier()
+ : Position(0), kind(InvalidSpecifier) {}
+
+ ConversionSpecifier(const char *pos, Kind k)
+ : Position(pos), kind(k) {}
+
+ const char *getConversionStart() const {
+ return Position;
+ }
bool isObjCArg() const { return kind >= ObjCBeg && kind <= ObjCEnd; }
bool isIntArg() const { return kind >= dArg && kind <= iArg; }
@@ -68,7 +76,8 @@
Kind getKind() const { return kind; }
private:
- const Kind kind;
+ const char *Position;
+ Kind kind;
};
enum LengthModifier {
@@ -115,19 +124,19 @@
};
class FormatSpecifier {
- unsigned conversionSpecifier : 6;
unsigned lengthModifier : 5;
unsigned flags : 5;
+ ConversionSpecifier conversionSpecifier;
OptionalAmount FieldWidth;
OptionalAmount Precision;
public:
- FormatSpecifier() : conversionSpecifier(0), lengthModifier(0), flags(0) {}
+ FormatSpecifier() : lengthModifier(0), flags(0) {}
static FormatSpecifier Parse(const char *beg, const char *end);
// Methods for incrementally constructing the FormatSpecifier.
- void setConversionSpecifier(ConversionSpecifier cs) {
- conversionSpecifier = (unsigned) cs.getKind();
+ void setConversionSpecifier(const ConversionSpecifier &CS) {
+ conversionSpecifier = CS;
}
void setLengthModifier(LengthModifier lm) {
lengthModifier = (unsigned) lm;
@@ -140,8 +149,8 @@
// Methods for querying the format specifier.
- ConversionSpecifier getConversionSpecifier() const {
- return (ConversionSpecifier::Kind) conversionSpecifier;
+ const ConversionSpecifier &getConversionSpecifier() const {
+ return conversionSpecifier;
}
LengthModifier getLengthModifier() const {
@@ -187,7 +196,9 @@
virtual bool HandleFormatSpecifier(const FormatSpecifier &FS,
const char *startSpecifier,
- const char *endSpecifier) { return false; }
+ unsigned specifierLen) {
+ return true;
+ }
};
bool ParseFormatString(FormatStringHandler &H,
Modified: cfe/trunk/lib/Analysis/PrintfFormatString.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=94739&r1=94738&r2=94739&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/PrintfFormatString.cpp (original)
+++ cfe/trunk/lib/Analysis/PrintfFormatString.cpp Wed Jan 27 20:46:17 2010
@@ -189,39 +189,42 @@
}
// 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 @@
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() {}
More information about the cfe-commits
mailing list