brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 43c823a Raw
165 lines · cpp
1//RUN: %clang_analyze_cc1 -cc1 -std=c++11  -analyzer-checker=core,apiModeling.google.GTest,debug.ExprInspection %s -verify2//RUN: %clang_analyze_cc1 -cc1 -std=c++11  -analyzer-checker=core,apiModeling.google.GTest,debug.ExprInspection -DGTEST_VERSION_1_8_AND_LATER=1 %s -verify3 4void clang_analyzer_eval(int);5void clang_analyzer_warnIfReached();6 7namespace std {8  class string {9    public:10    ~string();11    const char *c_str();12  };13}14 15namespace testing {16 17class Message { };18class TestPartResult {19 public:20  enum Type {21    kSuccess,22    kNonFatalFailure,23    kFatalFailure24  };25};26 27namespace internal {28 29class AssertHelper {30 public:31  AssertHelper(TestPartResult::Type type, const char* file, int line,32               const char* message);33  ~AssertHelper();34  void operator=(const Message& message) const;35};36 37 38template <typename T>39struct AddReference { typedef T& type; };40template <typename T>41struct AddReference<T&> { typedef T& type; };42template <typename From, typename To>43class ImplicitlyConvertible {44 private:45  static typename AddReference<From>::type MakeFrom();46  static char Helper(To);47  static char (&Helper(...))[2];48 public:49  static const bool value =50      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;51};52template <typename From, typename To>53const bool ImplicitlyConvertible<From, To>::value;54template<bool> struct EnableIf;55template<> struct EnableIf<true> { typedef void type; };56 57} // end internal58 59 60class AssertionResult {61public:62 63  // The implementation for the copy constructor is not exposed in the64  // interface.65  AssertionResult(const AssertionResult& other);66 67#if defined(GTEST_VERSION_1_8_AND_LATER)68  template <typename T>69  explicit AssertionResult(70      const T& success,71      typename internal::EnableIf<72          !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*73          /*enabler*/ = 0)74      : success_(success) {}75#else76  explicit AssertionResult(bool success) : success_(success) {}77#endif78 79  operator bool() const { return success_; }80 81  // The actual AssertionResult does not have an explicit destructor, but82  // it does have a non-trivial member veriable, so we add a destructor here83  // to force temporary cleanups.84  ~AssertionResult();85private:86 87  bool success_;88};89 90namespace internal {91std::string GetBoolAssertionFailureMessage(92    const AssertionResult& assertion_result,93    const char* expression_text,94    const char* actual_predicate_value,95    const char* expected_predicate_value);96} // end internal97 98} // end testing99 100#define GTEST_MESSAGE_AT_(file, line, message, result_type) \101  ::testing::internal::AssertHelper(result_type, file, line, message) \102    = ::testing::Message()103 104#define GTEST_MESSAGE_(message, result_type) \105  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)106 107#define GTEST_FATAL_FAILURE_(message) \108  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)109 110#define GTEST_NONFATAL_FAILURE_(message) \111  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)112 113# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:114 115#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \116  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \117  if (const ::testing::AssertionResult gtest_ar_ = \118      ::testing::AssertionResult(expression)) \119    ; \120  else \121    fail(::testing::internal::GetBoolAssertionFailureMessage(\122        gtest_ar_, text, #actual, #expected).c_str())123 124#define EXPECT_TRUE(condition) \125  GTEST_TEST_BOOLEAN_((condition), #condition, false, true, \126                      GTEST_NONFATAL_FAILURE_)127#define ASSERT_TRUE(condition) \128  GTEST_TEST_BOOLEAN_((condition), #condition, false, true, \129                      GTEST_FATAL_FAILURE_)130 131#define ASSERT_FALSE(condition) \132  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \133                      GTEST_FATAL_FAILURE_)134 135void testAssertTrue(int *p) {136  ASSERT_TRUE(p != nullptr);137  EXPECT_TRUE(1 == *p); // no-warning138}139 140void testAssertFalse(int *p) {141  ASSERT_FALSE(p == nullptr);142  EXPECT_TRUE(1 == *p); // no-warning143}144 145void testConstrainState(int p) {146  ASSERT_TRUE(p == 7);147 148  clang_analyzer_eval(p == 7); // expected-warning {{TRUE}}149 150  ASSERT_TRUE(false);151  clang_analyzer_warnIfReached(); // no-warning152}153 154void testAssertSymbolicPtr(const bool *b) {155  ASSERT_TRUE(*b); // no-crash156 157  clang_analyzer_eval(*b); // expected-warning{{TRUE}}158}159 160void testAssertSymbolicRef(const bool &b) {161  ASSERT_TRUE(b); // no-crash162 163  clang_analyzer_eval(b); // expected-warning{{TRUE}}164}165