40 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedCallArgsChecker -verify %s2 3void WTFCrash(void);4 5enum class Tag : bool { Value };6 7template <typename StorageType, Tag> class CanMakeCheckedPtrBase {8public:9 void incrementCheckedPtrCount() const { ++m_checkedPtrCount; }10 inline void decrementCheckedPtrCount() const11 {12 if (!m_checkedPtrCount)13 WTFCrash();14 --m_checkedPtrCount;15 }16 17private:18 mutable StorageType m_checkedPtrCount { 0 };19};20 21template<typename T, Tag tag>22class CanMakeCheckedPtr : public CanMakeCheckedPtrBase<unsigned int, tag> {23};24 25class CheckedObject : public CanMakeCheckedPtr<CheckedObject, Tag::Value> {26public:27 void doWork();28};29 30CheckedObject* provide();31void foo() {32 provide()->doWork();33 // expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}}34}35 36void doWorkWithObject(const CheckedObject&);37void bar() {38 doWorkWithObject(CheckedObject());39}40