18 #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_FORMATSTRING_H 19 #define LLVM_CLANG_ANALYSIS_ANALYSES_FORMATSTRING_H 29 namespace analyze_format_string {
36 : representation(Representation), flag(
false) {}
37 bool isSet()
const {
return flag; }
38 void set() { flag =
true; }
43 this->position = position;
49 const char *
toString()
const {
return representation; }
52 explicit operator bool()
const {
return flag; }
58 const char *representation;
88 : Position(nullptr),
kind(None) {}
90 : Position(pos),
kind(k) {}
117 const char *Position;
124 InvalidSpecifier = 0,
171 ObjCBeg = ObjCObjArg,
172 ObjCEnd = ObjCObjArg,
183 PrintfConvBeg = ObjCObjArg,
184 PrintfConvEnd = PrintErrno,
188 ScanfConvBeg = ScanListArg,
189 ScanfConvEnd = ScanListArg
193 : IsPrintf(isPrintf), Position(nullptr), EndScanList(nullptr),
194 kind(InvalidSpecifier) {}
197 : IsPrintf(isPrintf), Position(pos), EndScanList(nullptr),
kind(k) {}
204 return StringRef(getStart(), getLength());
214 case InvalidSpecifier:
224 return EndScanList ? EndScanList - Position : 1;
229 kind == FreeBSDrArg ||
kind == FreeBSDyArg; }
233 return kind >= DoubleArgBeg &&
kind <= DoubleArgEnd;
252 AnyCharTy, CStrTy, WCStrTy, WIntTy };
273 const char *Name =
nullptr;
278 enum class TypeKind { DontCare, SizeT, PtrdiffT };
279 TypeKind TK = TypeKind::DontCare;
282 ArgType(
Kind K = UnknownTy,
const char *N =
nullptr) : K(K), Name(N) {}
287 bool isValid()
const {
return K != InvalidTy; }
289 bool isSizeT()
const {
return TK == TypeKind::SizeT; }
295 assert(A.K >= InvalidTy &&
"ArgType cannot be pointer to invalid/unknown");
304 Res.TK = TypeKind::SizeT;
312 Res.TK = TypeKind::PtrdiffT;
322 std::string getRepresentativeTypeName(
ASTContext &C)
const;
331 const char *amountStart,
332 unsigned amountLength,
333 bool usesPositionalArg)
334 : start(amountStart),
length(amountLength), hs(howSpecified), amt(amount),
335 UsesPositionalArg(usesPositionalArg), UsesDotPrefix(0) {}
338 : start(nullptr),
length(0), hs(valid ? NotSpecified : Invalid), amt(0),
339 UsesPositionalArg(0), UsesDotPrefix(0) {}
342 : start(nullptr),
length(0), hs(Constant), amt(Amount),
343 UsesPositionalArg(
false), UsesDotPrefix(
false) {}
346 return hs == Invalid;
355 assert(hasDataArgument());
360 assert(hs == Constant);
366 return start - UsesDotPrefix;
370 assert(hs == Constant);
371 return length + UsesDotPrefix;
376 void toString(raw_ostream &os)
const;
380 assert(hasDataArgument());
392 bool UsesPositionalArg : 1;
411 : CS(isPrintf), VectorNumElts(
false),
412 UsesPositionalArg(
false), argIndex(0) {}
445 return VectorNumElts;
457 bool hasStandardLengthModifier()
const;
461 bool hasStandardConversionSpecifier(
const LangOptions &LangOpt)
const;
463 bool hasStandardLengthConversionCombination()
const;
475 namespace analyze_printf {
481 : ConversionSpecifier(
true, nullptr, InvalidSpecifier) {}
484 : ConversionSpecifier(
true, pos, k) {}
488 kind <= DoubleArgEnd; }
518 : FormatSpecifier(
true), HasThousandsGrouping(
"'"),
519 IsLeftJustified(
"-"), HasPlusPrefix(
"+"), HasSpacePrefix(
" "),
520 HasAlternativeForm(
"#"), HasLeadingZeroes(
"0"),
521 HasObjCTechnicalTerm(
"tt"), IsPrivate(
"private"), IsPublic(
"public"),
522 IsSensitive(
"sensitive") {}
561 return cast<PrintfConversionSpecifier>(CS);
574 return getConversionSpecifier().consumesDataArgument();
585 return HasThousandsGrouping;
607 void toString(raw_ostream &os)
const;
610 bool hasValidPlusPrefix()
const;
611 bool hasValidAlternativeForm()
const;
612 bool hasValidLeadingZeros()
const;
613 bool hasValidSpacePrefix()
const;
614 bool hasValidLeftJustified()
const;
615 bool hasValidThousandsGroupingPrefix()
const;
617 bool hasValidPrecision()
const;
618 bool hasValidFieldWidth()
const;
625 namespace analyze_scanf {
631 : ConversionSpecifier(
false, nullptr, InvalidSpecifier) {}
634 : ConversionSpecifier(
false, pos, k) {}
650 FormatSpecifier(
false),
651 SuppressAssignment(
"*") {}
658 return SuppressAssignment;
666 return cast<ScanfConversionSpecifier>(CS);
670 return CS.consumesDataArgument() && !SuppressAssignment;
678 void toString(raw_ostream &os)
const;
688 namespace analyze_format_string {
707 unsigned specifierLen) {}
710 unsigned flagsLen) {}
716 const char *flagsEnd,
717 const char *conversionPosition) {}
722 const char *startSpecifier,
723 unsigned specifierLen) {
728 const char *startSpecifier,
729 unsigned specifierLen) {
740 const char *startSpecifier,
741 unsigned specifierLen) {
746 const char *startSpecifier,
747 unsigned specifierLen) {
755 const char *beg,
const char *end,
const LangOptions &LO,
762 const char *beg,
const char *end,
const LangOptions &LO,
const OptionalFlag & hasAlternativeForm() const
A (possibly-)qualified type.
const ScanfConversionSpecifier & getConversionSpecifier() const
void setIsPublic(const char *position)
const OptionalFlag & getSuppressAssignment() const
bool consumesDataArgument() const
void setHasLeadingZeros(const char *position)
bool usesPositionalArg() const
const OptionalFlag & hasThousandsGrouping() const
PrintfConversionSpecifier(const char *pos, Kind k)
static bool classof(const analyze_format_string::ConversionSpecifier *CS)
void setPrecision(const OptionalAmount &Amt)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void setHasSpacePrefix(const char *position)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
void setConversionSpecifier(const PrintfConversionSpecifier &cs)
void setIsLeftJustified(const char *position)
void setUsesPositionalArg()
ScanfConversionSpecifier(const char *pos, Kind k)
const OptionalFlag & hasLeadingZeros() const
const OptionalFlag & hasPlusPrefix() const
Exposes information about the current target.
const OptionalFlag & isLeftJustified() const
const OptionalFlag & isSensitive() const
float __ovld __cnfn length(float p)
Return the length of vector p, i.e., sqrt(p.x2 + p.y 2 + ...)
StringRef getMaskType() const
void setMaskType(StringRef S)
void setIsPrivate(const char *position)
void setHasThousandsGrouping(const char *position)
void setConversionSpecifier(const ScanfConversionSpecifier &cs)
const PrintfConversionSpecifier & getConversionSpecifier() const
const OptionalFlag & hasObjCTechnicalTerm() const
Dataflow Directional Tag Classes.
void setSuppressAssignment(const char *position)
PrintfConversionSpecifier()
const OptionalFlag & isPrivate() const
void setHasObjCTechnicalTerm(const char *position)
const OptionalAmount & getPrecision() const
void setHasPlusPrefix(const char *position)
const OptionalFlag & isPublic() const
const OptionalFlag & hasSpacePrefix() const
ScanfConversionSpecifier()
bool consumesDataArgument() const
unsigned kind
All of the diagnostics that can be emitted by the frontend.
static bool classof(const analyze_format_string::ConversionSpecifier *CS)
void setHasAlternativeForm(const char *position)
void setIsSensitive(const char *position)