diff options
Diffstat (limited to 'include/clang/Analysis/Analyses/FormatString.h')
-rw-r--r-- | include/clang/Analysis/Analyses/FormatString.h | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h index 7f50ee3..5cb9731 100644 --- a/include/clang/Analysis/Analyses/FormatString.h +++ b/include/clang/Analysis/Analyses/FormatString.h @@ -23,6 +23,8 @@ namespace clang { +class TargetInfo; + //===----------------------------------------------------------------------===// /// Common components of both fprintf and fscanf format strings. namespace analyze_format_string { @@ -115,11 +117,14 @@ public: // C99 conversion specifiers. cArg, dArg, + DArg, // Apple extension iArg, - IntArgBeg = cArg, IntArgEnd = iArg, + IntArgBeg = dArg, IntArgEnd = iArg, oArg, + OArg, // Apple extension uArg, + UArg, // Apple extension xArg, XArg, UIntArgBeg = oArg, UIntArgEnd = XArg, @@ -157,7 +162,7 @@ public: ScanfConvBeg = ScanListArg, ScanfConvEnd = ScanListArg }; - ConversionSpecifier(bool isPrintf) + ConversionSpecifier(bool isPrintf = true) : IsPrintf(isPrintf), Position(0), EndScanList(0), kind(InvalidSpecifier) {} ConversionSpecifier(bool isPrintf, const char *pos, Kind k) @@ -189,10 +194,14 @@ public: return EndScanList ? EndScanList - Position : 1; } + bool isIntArg() const { return kind >= IntArgBeg && kind <= IntArgEnd; } bool isUIntArg() const { return kind >= UIntArgBeg && kind <= UIntArgEnd; } + bool isAnyIntArg() const { return kind >= IntArgBeg && kind <= UIntArgEnd; } const char *toString() const; bool isPrintfKind() const { return IsPrintf; } + + llvm::Optional<ConversionSpecifier> getStandardSpecifier() const; protected: bool IsPrintf; @@ -348,10 +357,12 @@ public: bool usesPositionalArg() const { return UsesPositionalArg; } - bool hasValidLengthModifier() const; + bool hasValidLengthModifier(const TargetInfo &Target) const; bool hasStandardLengthModifier() const; + llvm::Optional<LengthModifier> getCorrectedLengthModifier() const; + bool hasStandardConversionSpecifier(const LangOptions &LangOpt) const; bool hasStandardLengthConversionCombination() const; @@ -378,7 +389,6 @@ public: : ConversionSpecifier(true, pos, k) {} bool isObjCArg() const { return kind >= ObjCBeg && kind <= ObjCEnd; } - bool isIntArg() const { return kind >= IntArgBeg && kind <= IntArgEnd; } bool isDoubleArg() const { return kind >= DoubleArgBeg && kind <= DoubleArgEnd; } unsigned getLength() const { @@ -623,10 +633,12 @@ public: }; bool ParsePrintfString(FormatStringHandler &H, - const char *beg, const char *end, const LangOptions &LO); + const char *beg, const char *end, const LangOptions &LO, + const TargetInfo &Target); bool ParseScanfString(FormatStringHandler &H, - const char *beg, const char *end, const LangOptions &LO); + const char *beg, const char *end, const LangOptions &LO, + const TargetInfo &Target); } // end analyze_format_string namespace } // end clang namespace |