Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/lib/AST/FormatStringParsing.h
Line
Count
Source
1
#ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
2
#define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
3
4
#include "clang/AST/ASTContext.h"
5
#include "clang/AST/Type.h"
6
#include "clang/AST/FormatString.h"
7
8
namespace clang {
9
10
class LangOptions;
11
12
template <typename T>
13
class UpdateOnReturn {
14
  T &ValueToUpdate;
15
  const T &ValueToCopy;
16
public:
17
  UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
18
214k
    : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
19
20
214k
  ~UpdateOnReturn() {
21
214k
    ValueToUpdate = ValueToCopy;
22
214k
  }
23
};
24
25
namespace analyze_format_string {
26
27
OptionalAmount ParseAmount(const char *&Beg, const char *E);
28
OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
29
                                      unsigned &argIndex);
30
31
OptionalAmount ParsePositionAmount(FormatStringHandler &H,
32
                                   const char *Start, const char *&Beg,
33
                                   const char *E, PositionContext p);
34
35
bool ParseFieldWidth(FormatStringHandler &H,
36
                     FormatSpecifier &CS,
37
                     const char *Start, const char *&Beg, const char *E,
38
                     unsigned *argIndex);
39
40
bool ParseArgPosition(FormatStringHandler &H,
41
                      FormatSpecifier &CS, const char *Start,
42
                      const char *&Beg, const char *E);
43
44
bool ParseVectorModifier(FormatStringHandler &H,
45
                         FormatSpecifier &FS, const char *&Beg, const char *E,
46
                         const LangOptions &LO);
47
48
/// Returns true if a LengthModifier was parsed and installed in the
49
/// FormatSpecifier& argument, and false otherwise.
50
bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
51
                         const LangOptions &LO, bool IsScanf = false);
52
53
/// Returns true if the invalid specifier in \p SpecifierBegin is a UTF-8
54
/// string; check that it won't go further than \p FmtStrEnd and write
55
/// up the total size in \p Len.
56
bool ParseUTF8InvalidSpecifier(const char *SpecifierBegin,
57
                               const char *FmtStrEnd, unsigned &Len);
58
59
template <typename T> class SpecifierResult {
60
  T FS;
61
  const char *Start;
62
  bool Stop;
63
public:
64
  SpecifierResult(bool stop = false)
65
39.1k
  : Start(nullptr), Stop(stop) {}
clang::analyze_format_string::SpecifierResult<clang::analyze_printf::PrintfSpecifier>::SpecifierResult(bool)
Line
Count
Source
65
38.6k
  : Start(nullptr), Stop(stop) {}
clang::analyze_format_string::SpecifierResult<clang::analyze_scanf::ScanfSpecifier>::SpecifierResult(bool)
Line
Count
Source
65
414
  : Start(nullptr), Stop(stop) {}
66
  SpecifierResult(const char *start,
67
                  const T &fs)
68
57.7k
  : FS(fs), Start(start), Stop(false) {}
clang::analyze_format_string::SpecifierResult<clang::analyze_printf::PrintfSpecifier>::SpecifierResult(char const*, clang::analyze_printf::PrintfSpecifier const&)
Line
Count
Source
68
56.1k
  : FS(fs), Start(start), Stop(false) {}
clang::analyze_format_string::SpecifierResult<clang::analyze_scanf::ScanfSpecifier>::SpecifierResult(char const*, clang::analyze_scanf::ScanfSpecifier const&)
Line
Count
Source
68
1.58k
  : FS(fs), Start(start), Stop(false) {}
69
70
114k
  const char *getStart() const { return Start; }
clang::analyze_format_string::SpecifierResult<clang::analyze_printf::PrintfSpecifier>::getStart() const
Line
Count
Source
70
111k
  const char *getStart() const { return Start; }
clang::analyze_format_string::SpecifierResult<clang::analyze_scanf::ScanfSpecifier>::getStart() const
Line
Count
Source
70
3.17k
  const char *getStart() const { return Start; }
71
96.8k
  bool shouldStop() const { return Stop; }
clang::analyze_format_string::SpecifierResult<clang::analyze_printf::PrintfSpecifier>::shouldStop() const
Line
Count
Source
71
94.8k
  bool shouldStop() const { return Stop; }
clang::analyze_format_string::SpecifierResult<clang::analyze_scanf::ScanfSpecifier>::shouldStop() const
Line
Count
Source
71
2.00k
  bool shouldStop() const { return Stop; }
72
96.7k
  bool hasValue() const { return Start != nullptr; }
clang::analyze_format_string::SpecifierResult<clang::analyze_printf::PrintfSpecifier>::hasValue() const
Line
Count
Source
72
94.7k
  bool hasValue() const { return Start != nullptr; }
clang::analyze_format_string::SpecifierResult<clang::analyze_scanf::ScanfSpecifier>::hasValue() const
Line
Count
Source
72
1.98k
  bool hasValue() const { return Start != nullptr; }
73
57.7k
  const T &getValue() const {
74
57.7k
    assert(hasValue());
75
57.7k
    return FS;
76
57.7k
  }
clang::analyze_format_string::SpecifierResult<clang::analyze_printf::PrintfSpecifier>::getValue() const
Line
Count
Source
73
56.1k
  const T &getValue() const {
74
56.1k
    assert(hasValue());
75
56.1k
    return FS;
76
56.1k
  }
clang::analyze_format_string::SpecifierResult<clang::analyze_scanf::ScanfSpecifier>::getValue() const
Line
Count
Source
73
1.58k
  const T &getValue() const {
74
1.58k
    assert(hasValue());
75
1.58k
    return FS;
76
1.58k
  }
77
  const T &getValue() { return FS; }
78
};
79
80
} // end analyze_format_string namespace
81
} // end clang namespace
82
83
#endif