From: Ted Kremenek Date: Tue, 20 Jul 2010 20:04:42 +0000 (+0000) Subject: Move 'hasValidLengthModifier' from PrintfFormatSpecifier to FormatSpecifier. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a412a499162c46211c10ad92045b9b5fd2298ede;p=clang Move 'hasValidLengthModifier' from PrintfFormatSpecifier to FormatSpecifier. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108906 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h index eaa369cd17..3a5722a54a 100644 --- a/include/clang/Analysis/Analyses/FormatString.h +++ b/include/clang/Analysis/Analyses/FormatString.h @@ -296,13 +296,15 @@ class FormatSpecifier { protected: LengthModifier LM; OptionalAmount FieldWidth; + ConversionSpecifier CS; /// Positional arguments, an IEEE extension: /// IEEE Std 1003.1, 2004 Edition /// http://www.opengroup.org/onlinepubs/009695399/functions/printf.html bool UsesPositionalArg; unsigned argIndex; public: - FormatSpecifier() : UsesPositionalArg(false), argIndex(0) {} + FormatSpecifier(bool isPrintf) + : CS(isPrintf), UsesPositionalArg(false), argIndex(0) {} void setLengthModifier(LengthModifier lm) { LM = lm; @@ -335,6 +337,8 @@ public: } bool usesPositionalArg() const { return UsesPositionalArg; } + + bool hasValidLengthModifier() const; }; } // end analyze_format_string namespace @@ -380,12 +384,12 @@ class PrintfSpecifier : public analyze_format_string::FormatSpecifier { OptionalFlag HasSpacePrefix; // ' ' OptionalFlag HasAlternativeForm; // '#' OptionalFlag HasLeadingZeroes; // '0' - analyze_format_string::ConversionSpecifier CS; OptionalAmount Precision; public: PrintfSpecifier() : + FormatSpecifier(/* isPrintf = */ true), IsLeftJustified("-"), HasPlusPrefix("+"), HasSpacePrefix(" "), - HasAlternativeForm("#"), HasLeadingZeroes("0"), CS(/* isPrintf = */ true) {} + HasAlternativeForm("#"), HasLeadingZeroes("0") {} static PrintfSpecifier Parse(const char *beg, const char *end); @@ -462,7 +466,6 @@ public: bool hasValidSpacePrefix() const; bool hasValidLeftJustified() const; - bool hasValidLengthModifier() const; bool hasValidPrecision() const; bool hasValidFieldWidth() const; }; @@ -483,6 +486,10 @@ public: : ConversionSpecifier(false, pos, k) {} void setEndScanList(const char *pos) { EndScanList = pos; } + + static bool classof(const analyze_format_string::ConversionSpecifier *CS) { + return !CS->isPrintfKind(); + } }; using analyze_format_string::LengthModifier; @@ -491,9 +498,10 @@ using analyze_format_string::OptionalFlag; class ScanfSpecifier : public analyze_format_string::FormatSpecifier { OptionalFlag SuppressAssignment; // '*' - ScanfConversionSpecifier CS; public: - ScanfSpecifier() : SuppressAssignment("*") {} + ScanfSpecifier() : + FormatSpecifier(/* isPrintf = */ false), + SuppressAssignment("*") {} void setSuppressAssignment(const char *position) { SuppressAssignment = true; @@ -509,7 +517,7 @@ public: } const ScanfConversionSpecifier &getConversionSpecifier() const { - return CS; + return cast(CS); } bool consumesDataArgument() const { @@ -517,7 +525,6 @@ public: } static ScanfSpecifier Parse(const char *beg, const char *end); - }; } // end analyze_scanf namespace diff --git a/lib/Analysis/FormatString.cpp b/lib/Analysis/FormatString.cpp index dcd18db16c..0fbe54353e 100644 --- a/lib/Analysis/FormatString.cpp +++ b/lib/Analysis/FormatString.cpp @@ -20,6 +20,7 @@ using clang::analyze_format_string::FormatSpecifier; using clang::analyze_format_string::LengthModifier; using clang::analyze_format_string::OptionalAmount; using clang::analyze_format_string::PositionContext; +using clang::analyze_format_string::ConversionSpecifier; using namespace clang; // Key function to FormatStringHandler. @@ -356,8 +357,7 @@ analyze_format_string::LengthModifier::toString() const { // Methods on OptionalAmount. //===----------------------------------------------------------------------===// -void -analyze_format_string::OptionalAmount::toString(llvm::raw_ostream &os) const { +void OptionalAmount::toString(llvm::raw_ostream &os) const { switch (hs) { case Invalid: case NotSpecified: @@ -378,3 +378,76 @@ analyze_format_string::OptionalAmount::toString(llvm::raw_ostream &os) const { } } +//===----------------------------------------------------------------------===// +// Methods on ConversionSpecifier. +//===----------------------------------------------------------------------===// + +bool FormatSpecifier::hasValidLengthModifier() const { + switch (LM.getKind()) { + case LengthModifier::None: + return true; + + // Handle most integer flags + case LengthModifier::AsChar: + case LengthModifier::AsShort: + case LengthModifier::AsLongLong: + case LengthModifier::AsIntMax: + case LengthModifier::AsSizeT: + case LengthModifier::AsPtrDiff: + switch (CS.getKind()) { + case ConversionSpecifier::dArg: + case ConversionSpecifier::iArg: + case ConversionSpecifier::oArg: + case ConversionSpecifier::uArg: + case ConversionSpecifier::xArg: + case ConversionSpecifier::XArg: + case ConversionSpecifier::nArg: + return true; + default: + return false; + } + + // Handle 'l' flag + case LengthModifier::AsLong: + switch (CS.getKind()) { + case ConversionSpecifier::dArg: + case ConversionSpecifier::iArg: + case ConversionSpecifier::oArg: + case ConversionSpecifier::uArg: + case ConversionSpecifier::xArg: + case ConversionSpecifier::XArg: + case ConversionSpecifier::aArg: + case ConversionSpecifier::AArg: + case ConversionSpecifier::fArg: + case ConversionSpecifier::FArg: + case ConversionSpecifier::eArg: + case ConversionSpecifier::EArg: + case ConversionSpecifier::gArg: + case ConversionSpecifier::GArg: + case ConversionSpecifier::nArg: + case ConversionSpecifier::cArg: + case ConversionSpecifier::sArg: + return true; + default: + return false; + } + + case LengthModifier::AsLongDouble: + switch (CS.getKind()) { + case ConversionSpecifier::aArg: + case ConversionSpecifier::AArg: + case ConversionSpecifier::fArg: + case ConversionSpecifier::FArg: + case ConversionSpecifier::eArg: + case ConversionSpecifier::EArg: + case ConversionSpecifier::gArg: + case ConversionSpecifier::GArg: + return true; + default: + return false; + } + } + return false; +} + + diff --git a/lib/Analysis/PrintfFormatString.cpp b/lib/Analysis/PrintfFormatString.cpp index 49d10009b1..727de2934f 100644 --- a/lib/Analysis/PrintfFormatString.cpp +++ b/lib/Analysis/PrintfFormatString.cpp @@ -562,74 +562,6 @@ bool PrintfSpecifier::hasValidLeftJustified() const { } } -bool PrintfSpecifier::hasValidLengthModifier() const { - switch (LM.getKind()) { - case LengthModifier::None: - return true; - - // Handle most integer flags - case LengthModifier::AsChar: - case LengthModifier::AsShort: - case LengthModifier::AsLongLong: - case LengthModifier::AsIntMax: - case LengthModifier::AsSizeT: - case LengthModifier::AsPtrDiff: - switch (CS.getKind()) { - case ConversionSpecifier::dArg: - case ConversionSpecifier::iArg: - case ConversionSpecifier::oArg: - case ConversionSpecifier::uArg: - case ConversionSpecifier::xArg: - case ConversionSpecifier::XArg: - case ConversionSpecifier::nArg: - return true; - default: - return false; - } - - // Handle 'l' flag - case LengthModifier::AsLong: - switch (CS.getKind()) { - case ConversionSpecifier::dArg: - case ConversionSpecifier::iArg: - case ConversionSpecifier::oArg: - case ConversionSpecifier::uArg: - case ConversionSpecifier::xArg: - case ConversionSpecifier::XArg: - case ConversionSpecifier::aArg: - case ConversionSpecifier::AArg: - case ConversionSpecifier::fArg: - case ConversionSpecifier::FArg: - case ConversionSpecifier::eArg: - case ConversionSpecifier::EArg: - case ConversionSpecifier::gArg: - case ConversionSpecifier::GArg: - case ConversionSpecifier::nArg: - case ConversionSpecifier::cArg: - case ConversionSpecifier::sArg: - return true; - default: - return false; - } - - case LengthModifier::AsLongDouble: - switch (CS.getKind()) { - case ConversionSpecifier::aArg: - case ConversionSpecifier::AArg: - case ConversionSpecifier::fArg: - case ConversionSpecifier::FArg: - case ConversionSpecifier::eArg: - case ConversionSpecifier::EArg: - case ConversionSpecifier::gArg: - case ConversionSpecifier::GArg: - return true; - default: - return false; - } - } - return false; -} - bool PrintfSpecifier::hasValidPrecision() const { if (Precision.getHowSpecified() == OptionalAmount::NotSpecified) return true;