19 #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_FORMATSTRING_H
20 #define LLVM_CLANG_ANALYSIS_ANALYSES_FORMATSTRING_H
30 namespace analyze_format_string {
37 : representation(Representation), flag(
false) {}
38 bool isSet()
const {
return flag; }
39 void set() { flag =
true; }
44 this->position = position;
50 const char *
toString()
const {
return representation; }
53 explicit operator bool()
const {
return flag; }
59 const char *representation;
88 : Position(nullptr), kind(
None) {}
90 : Position(pos), kind(k) {}
117 const char *Position;
263 : K(k), Name(n), Ptr(
false) {}
273 assert(A.K >=
InvalidTy &&
"ArgType cannot be pointer to invalid/unknown");
292 const char *amountStart,
293 unsigned amountLength,
295 : start(amountStart), length(amountLength), hs(howSpecified), amt(amount),
296 UsesPositionalArg(usesPositionalArg), UsesDotPrefix(0) {}
300 UsesPositionalArg(0), UsesDotPrefix(0) {}
323 return start - UsesDotPrefix;
328 return length + UsesDotPrefix;
333 void toString(raw_ostream &os)
const;
349 bool UsesPositionalArg : 1;
420 namespace analyze_printf {
446 OptionalFlag HasThousandsGrouping;
447 OptionalFlag IsLeftJustified;
448 OptionalFlag HasPlusPrefix;
449 OptionalFlag HasSpacePrefix;
450 OptionalFlag HasAlternativeForm;
451 OptionalFlag HasLeadingZeroes;
452 OptionalFlag HasObjCTechnicalTerm;
453 OptionalFlag IsPrivate;
454 OptionalFlag IsPublic;
455 OptionalAmount Precision;
459 IsLeftJustified(
"-"), HasPlusPrefix(
"+"), HasSpacePrefix(
" "),
460 HasAlternativeForm(
"#"), HasLeadingZeroes(
"0"),
461 HasObjCTechnicalTerm(
"tt"), IsPrivate(
"private"), IsPublic(
"public") {}
470 HasThousandsGrouping.setPosition(position);
473 IsLeftJustified.setPosition(position);
476 HasPlusPrefix.setPosition(position);
479 HasSpacePrefix.setPosition(position);
482 HasAlternativeForm.setPosition(position);
485 HasLeadingZeroes.setPosition(position);
488 HasObjCTechnicalTerm.setPosition(position);
490 void setIsPrivate(
const char *position) { IsPrivate.setPosition(position); }
491 void setIsPublic(
const char *position) { IsPublic.setPosition(position); }
497 return cast<PrintfConversionSpecifier>(
CS);
502 Precision.setUsesDotPrefix();
521 return HasThousandsGrouping;
529 const OptionalFlag &
isPrivate()
const {
return IsPrivate; }
530 const OptionalFlag &
isPublic()
const {
return IsPublic; }
539 void toString(raw_ostream &os)
const;
557 namespace analyze_scanf {
579 OptionalFlag SuppressAssignment;
583 SuppressAssignment(
"*") {}
586 SuppressAssignment.setPosition(position);
590 return SuppressAssignment;
598 return cast<ScanfConversionSpecifier>(
CS);
610 void toString(raw_ostream &os)
const;
620 namespace analyze_format_string {
639 unsigned specifierLen) {}
642 unsigned flagsLen) {}
648 const char *flagsEnd,
649 const char *conversionPosition) {}
654 const char *startSpecifier,
655 unsigned specifierLen) {
660 const char *startSpecifier,
661 unsigned specifierLen) {
669 const char *startSpecifier,
670 unsigned specifierLen) {
675 const char *startSpecifier,
676 unsigned specifierLen) {
684 const char *beg,
const char *end,
const LangOptions &LO,
685 const TargetInfo &Target,
bool isFreeBSDKPrintf);
691 const char *beg,
const char *end,
const LangOptions &LO,
const OptionalFlag & hasSpacePrefix() const
A (possibly-)qualified type.
const OptionalFlag & getSuppressAssignment() const
void setIsPublic(const char *position)
const ScanfConversionSpecifier & getConversionSpecifier() const
bool hasValidThousandsGroupingPrefix() const
const OptionalFlag & hasLeadingZeros() const
bool usesPositionalArg() const
void setHasLeadingZeros(const char *position)
bool consumesDataArgument() const
ArgType getArgType(ASTContext &Ctx, bool IsObjCLiteral) const
Returns the builtin type that a data argument paired with this format specifier should have...
static ScanfSpecifier Parse(const char *beg, const char *end)
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)
bool hasValidPlusPrefix() const
void setIsLeftJustified(const char *position)
void setUsesPositionalArg()
bool fixType(QualType QT, QualType RawQT, const LangOptions &LangOpt, ASTContext &Ctx)
ScanfConversionSpecifier(const char *pos, Kind k)
Exposes information about the current target.
bool hasValidAlternativeForm() const
const OptionalFlag & hasObjCTechnicalTerm() const
bool hasValidFieldWidth() const
bool fixType(QualType QT, const LangOptions &LangOpt, ASTContext &Ctx, bool IsObjCLiteral)
Changes the specifier and length according to a QualType, retaining any flags or options.
const PrintfConversionSpecifier & getConversionSpecifier() const
void setIsPrivate(const char *position)
const OptionalFlag & hasPlusPrefix() const
void setHasThousandsGrouping(const char *position)
bool hasValidPrecision() const
void setConversionSpecifier(const ScanfConversionSpecifier &cs)
bool hasValidLeadingZeros() const
void setSuppressAssignment(const char *position)
PrintfConversionSpecifier()
const OptionalFlag & hasThousandsGrouping() const
bool consumesDataArgument() const
ArgType getArgType(ASTContext &Ctx) const
void setHasObjCTechnicalTerm(const char *position)
static PrintfSpecifier Parse(const char *beg, const char *end)
bool hasValidSpacePrefix() const
const OptionalAmount & getPrecision() const
const OptionalFlag & hasAlternativeForm() const
void setHasPlusPrefix(const char *position)
bool hasValidLeftJustified() const
void toString(raw_ostream &os) const
void toString(raw_ostream &os) const
const OptionalFlag & isPrivate() const
const OptionalFlag & isLeftJustified() const
ScanfConversionSpecifier()
static bool classof(const analyze_format_string::ConversionSpecifier *CS)
void setHasAlternativeForm(const char *position)
const OptionalFlag & isPublic() const