FormatStringParsing.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
  2. #define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
  3. #include "clang/AST/ASTContext.h"
  4. #include "clang/AST/Type.h"
  5. #include "clang/Analysis/Analyses/FormatString.h"
  6. #include "llvm/Support/raw_ostream.h"
  7. namespace clang {
  8. class LangOptions;
  9. template <typename T>
  10. class UpdateOnReturn {
  11. T &ValueToUpdate;
  12. const T &ValueToCopy;
  13. public:
  14. UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
  15. : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
  16. ~UpdateOnReturn() {
  17. ValueToUpdate = ValueToCopy;
  18. }
  19. };
  20. namespace analyze_format_string {
  21. OptionalAmount ParseAmount(const char *&Beg, const char *E);
  22. OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
  23. unsigned &argIndex);
  24. OptionalAmount ParsePositionAmount(FormatStringHandler &H,
  25. const char *Start, const char *&Beg,
  26. const char *E, PositionContext p);
  27. bool ParseFieldWidth(FormatStringHandler &H,
  28. FormatSpecifier &CS,
  29. const char *Start, const char *&Beg, const char *E,
  30. unsigned *argIndex);
  31. bool ParseArgPosition(FormatStringHandler &H,
  32. FormatSpecifier &CS, const char *Start,
  33. const char *&Beg, const char *E);
  34. /// Returns true if a LengthModifier was parsed and installed in the
  35. /// FormatSpecifier& argument, and false otherwise.
  36. bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
  37. const LangOptions &LO, bool IsScanf = false);
  38. template <typename T> class SpecifierResult {
  39. T FS;
  40. const char *Start;
  41. bool Stop;
  42. public:
  43. SpecifierResult(bool stop = false)
  44. : Start(nullptr), Stop(stop) {}
  45. SpecifierResult(const char *start,
  46. const T &fs)
  47. : FS(fs), Start(start), Stop(false) {}
  48. const char *getStart() const { return Start; }
  49. bool shouldStop() const { return Stop; }
  50. bool hasValue() const { return Start != nullptr; }
  51. const T &getValue() const {
  52. assert(hasValue());
  53. return FS;
  54. }
  55. const T &getValue() { return FS; }
  56. };
  57. } // end analyze_format_string namespace
  58. } // end clang namespace
  59. #endif