diff options
Diffstat (limited to 'include/clang/Analysis/Analyses/FormatString.h')
-rw-r--r-- | include/clang/Analysis/Analyses/FormatString.h | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h index 74803a295d712..8c531d638cc22 100644 --- a/include/clang/Analysis/Analyses/FormatString.h +++ b/include/clang/Analysis/Analyses/FormatString.h @@ -35,7 +35,7 @@ class OptionalFlag { public: OptionalFlag(const char *Representation) : representation(Representation), flag(false) {} - bool isSet() { return flag; } + bool isSet() const { return flag; } void set() { flag = true; } void clear() { flag = false; } void setPosition(const char *position) { @@ -122,12 +122,13 @@ class ConversionSpecifier { public: enum Kind { InvalidSpecifier = 0, - // C99 conversion specifiers. + // C99 conversion specifiers. cArg, dArg, DArg, // Apple extension iArg, - IntArgBeg = dArg, IntArgEnd = iArg, + IntArgBeg = dArg, + IntArgEnd = iArg, oArg, OArg, // Apple extension @@ -135,7 +136,8 @@ public: UArg, // Apple extension xArg, XArg, - UIntArgBeg = oArg, UIntArgEnd = XArg, + UIntArgBeg = oArg, + UIntArgEnd = XArg, fArg, FArg, @@ -145,7 +147,8 @@ public: GArg, aArg, AArg, - DoubleArgBeg = fArg, DoubleArgEnd = AArg, + DoubleArgBeg = fArg, + DoubleArgEnd = AArg, sArg, pArg, @@ -154,13 +157,19 @@ public: CArg, SArg, + // Apple extension: P specifies to os_log that the data being pointed to is + // to be copied by os_log. The precision indicates the number of bytes to + // copy. + PArg, + // ** Printf-specific ** ZArg, // MS extension // Objective-C specific specifiers. - ObjCObjArg, // '@' - ObjCBeg = ObjCObjArg, ObjCEnd = ObjCObjArg, + ObjCObjArg, // '@' + ObjCBeg = ObjCObjArg, + ObjCEnd = ObjCObjArg, // FreeBSD kernel specific specifiers. FreeBSDbArg, @@ -169,13 +178,15 @@ public: FreeBSDyArg, // GlibC specific specifiers. - PrintErrno, // 'm' + PrintErrno, // 'm' - PrintfConvBeg = ObjCObjArg, PrintfConvEnd = PrintErrno, + PrintfConvBeg = ObjCObjArg, + PrintfConvEnd = PrintErrno, // ** Scanf-specific ** ScanListArg, // '[' - ScanfConvBeg = ScanListArg, ScanfConvEnd = ScanListArg + ScanfConvBeg = ScanListArg, + ScanfConvEnd = ScanListArg }; ConversionSpecifier(bool isPrintf = true) @@ -200,6 +211,8 @@ public: return false; case PercentArg: return false; + case InvalidSpecifier: + return false; default: return true; } @@ -437,13 +450,15 @@ class PrintfSpecifier : public analyze_format_string::FormatSpecifier { OptionalFlag HasAlternativeForm; // '#' OptionalFlag HasLeadingZeroes; // '0' OptionalFlag HasObjCTechnicalTerm; // '[tt]' + OptionalFlag IsPrivate; // '{private}' + OptionalFlag IsPublic; // '{public}' OptionalAmount Precision; public: - PrintfSpecifier() : - FormatSpecifier(/* isPrintf = */ true), - HasThousandsGrouping("'"), IsLeftJustified("-"), HasPlusPrefix("+"), - HasSpacePrefix(" "), HasAlternativeForm("#"), HasLeadingZeroes("0"), - HasObjCTechnicalTerm("tt") {} + PrintfSpecifier() + : FormatSpecifier(/* isPrintf = */ true), HasThousandsGrouping("'"), + IsLeftJustified("-"), HasPlusPrefix("+"), HasSpacePrefix(" "), + HasAlternativeForm("#"), HasLeadingZeroes("0"), + HasObjCTechnicalTerm("tt"), IsPrivate("private"), IsPublic("public") {} static PrintfSpecifier Parse(const char *beg, const char *end); @@ -472,6 +487,8 @@ public: void setHasObjCTechnicalTerm(const char *position) { HasObjCTechnicalTerm.setPosition(position); } + void setIsPrivate(const char *position) { IsPrivate.setPosition(position); } + void setIsPublic(const char *position) { IsPublic.setPosition(position); } void setUsesPositionalArg() { UsesPositionalArg = true; } // Methods for querying the format specifier. @@ -509,6 +526,8 @@ public: const OptionalFlag &hasLeadingZeros() const { return HasLeadingZeroes; } const OptionalFlag &hasSpacePrefix() const { return HasSpacePrefix; } const OptionalFlag &hasObjCTechnicalTerm() const { return HasObjCTechnicalTerm; } + const OptionalFlag &isPrivate() const { return IsPrivate; } + const OptionalFlag &isPublic() const { return IsPublic; } bool usesPositionalArg() const { return UsesPositionalArg; } /// Changes the specifier and length according to a QualType, retaining any |