diff options
Diffstat (limited to 'include/clang/Analysis/Analyses')
| -rw-r--r-- | include/clang/Analysis/Analyses/Dominators.h | 4 | ||||
| -rw-r--r-- | include/clang/Analysis/Analyses/FormatString.h | 24 | ||||
| -rw-r--r-- | include/clang/Analysis/Analyses/LiveVariables.h | 7 | ||||
| -rw-r--r-- | include/clang/Analysis/Analyses/ThreadSafety.h | 15 | ||||
| -rw-r--r-- | include/clang/Analysis/Analyses/ThreadSafetyCommon.h | 12 | ||||
| -rw-r--r-- | include/clang/Analysis/Analyses/ThreadSafetyTIL.h | 8 | ||||
| -rw-r--r-- | include/clang/Analysis/Analyses/ThreadSafetyUtil.h | 54 |
7 files changed, 69 insertions, 55 deletions
diff --git a/include/clang/Analysis/Analyses/Dominators.h b/include/clang/Analysis/Analyses/Dominators.h index fcef0fc10ac8..4524aebe4e8b 100644 --- a/include/clang/Analysis/Analyses/Dominators.h +++ b/include/clang/Analysis/Analyses/Dominators.h @@ -44,9 +44,7 @@ public: DT = new llvm::DominatorTreeBase<CFGBlock>(false); } - ~DominatorTree() { - delete DT; - } + ~DominatorTree() override { delete DT; } llvm::DominatorTreeBase<CFGBlock>& getBase() { return *DT; } diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h index 174cce4f363c..2e8058dabda2 100644 --- a/include/clang/Analysis/Analyses/FormatString.h +++ b/include/clang/Analysis/Analyses/FormatString.h @@ -49,7 +49,7 @@ public: const char *toString() const { return representation; } // Overloaded operators for bool like qualities - LLVM_EXPLICIT operator bool() const { return flag; } + explicit operator bool() const { return flag; } OptionalFlag& operator=(const bool &rhs) { flag = rhs; return *this; // Return a reference to myself. @@ -161,6 +161,12 @@ public: ObjCObjArg, // '@' ObjCBeg = ObjCObjArg, ObjCEnd = ObjCObjArg, + // FreeBSD kernel specific specifiers. + FreeBSDbArg, + FreeBSDDArg, + FreeBSDrArg, + FreeBSDyArg, + // GlibC specific specifiers. PrintErrno, // 'm' @@ -204,7 +210,8 @@ public: return EndScanList ? EndScanList - Position : 1; } - bool isIntArg() const { return kind >= IntArgBeg && kind <= IntArgEnd; } + bool isIntArg() const { return (kind >= IntArgBeg && kind <= IntArgEnd) || + kind == FreeBSDrArg || kind == FreeBSDyArg; } bool isUIntArg() const { return kind >= UIntArgBeg && kind <= UIntArgEnd; } bool isAnyIntArg() const { return kind >= IntArgBeg && kind <= UIntArgEnd; } const char *toString() const; @@ -224,6 +231,9 @@ class ArgType { public: enum Kind { UnknownTy, InvalidTy, SpecificTy, ObjCPointerTy, CPointerTy, AnyCharTy, CStrTy, WCStrTy, WIntTy }; + + enum MatchKind { NoMatch = 0, Match = 1, NoMatchPedantic }; + private: const Kind K; QualType T; @@ -247,7 +257,7 @@ public: return Res; } - bool matchesType(ASTContext &C, QualType argTy) const; + MatchKind matchesType(ASTContext &C, QualType argTy) const; QualType getRepresentativeType(ASTContext &C) const; @@ -646,10 +656,10 @@ public: bool ParsePrintfString(FormatStringHandler &H, const char *beg, const char *end, const LangOptions &LO, - const TargetInfo &Target); - -bool ParseFormatStringHasSArg(const char *beg, const char *end, const LangOptions &LO, - const TargetInfo &Target); + const TargetInfo &Target, bool isFreeBSDKPrintf); + +bool ParseFormatStringHasSArg(const char *beg, const char *end, + const LangOptions &LO, const TargetInfo &Target); bool ParseScanfString(FormatStringHandler &H, const char *beg, const char *end, const LangOptions &LO, diff --git a/include/clang/Analysis/Analyses/LiveVariables.h b/include/clang/Analysis/Analyses/LiveVariables.h index c29dd409e56c..e17f73a61f81 100644 --- a/include/clang/Analysis/Analyses/LiveVariables.h +++ b/include/clang/Analysis/Analyses/LiveVariables.h @@ -44,8 +44,6 @@ public: llvm::ImmutableSet<const VarDecl *> LiveDecls) : liveStmts(LiveStmts), liveDecls(LiveDecls) {} - ~LivenessValues() {} - bool isLive(const Stmt *S) const; bool isLive(const VarDecl *D) const; @@ -66,11 +64,10 @@ public: /// Called when the live variables analysis registers /// that a variable is killed. virtual void observerKill(const DeclRefExpr *DR) {} - }; + }; + ~LiveVariables() override; - virtual ~LiveVariables(); - /// Compute the liveness information for a given CFG. static LiveVariables *computeLiveness(AnalysisDeclContext &analysisContext, bool killAtAssign); diff --git a/include/clang/Analysis/Analyses/ThreadSafety.h b/include/clang/Analysis/Analyses/ThreadSafety.h index 458bb576f459..22694a7a225a 100644 --- a/include/clang/Analysis/Analyses/ThreadSafety.h +++ b/include/clang/Analysis/Analyses/ThreadSafety.h @@ -26,6 +26,8 @@ namespace clang { namespace threadSafety { +class BeforeSet; + /// This enum distinguishes between different kinds of operations that may /// need to be protected by locks. We use this enum in error handling. enum ProtectedOperationKind { @@ -183,6 +185,14 @@ public: virtual void handleFunExcludesLock(StringRef Kind, Name FunName, Name LockName, SourceLocation Loc) {} + + /// Warn that L1 cannot be acquired before L2. + virtual void handleLockAcquiredBefore(StringRef Kind, Name L1Name, + Name L2Name, SourceLocation Loc) {} + + /// Warn that there is a cycle in acquired_before/after dependencies. + virtual void handleBeforeAfterCycle(Name L1Name, SourceLocation Loc) {} + /// Called by the analysis when starting analysis of a function. /// Used to issue suggestions for changes to annotations. virtual void enterFunction(const FunctionDecl *FD) {} @@ -203,7 +213,10 @@ private: /// at the end of each block, and issue warnings for thread safety violations. /// Each block in the CFG is traversed exactly once. void runThreadSafetyAnalysis(AnalysisDeclContext &AC, - ThreadSafetyHandler &Handler); + ThreadSafetyHandler &Handler, + BeforeSet **Bset); + +void threadSafetyCleanup(BeforeSet *Cache); /// \brief Helper function that returns a LockKind required for the given level /// of access. diff --git a/include/clang/Analysis/Analyses/ThreadSafetyCommon.h b/include/clang/Analysis/Analyses/ThreadSafetyCommon.h index be81121c102b..9b7725ab0f3c 100644 --- a/include/clang/Analysis/Analyses/ThreadSafetyCommon.h +++ b/include/clang/Analysis/Analyses/ThreadSafetyCommon.h @@ -286,6 +286,14 @@ public: sx::partiallyMatches(CapExpr, other.CapExpr); } + const ValueDecl* valueDecl() const { + if (Negated) + return nullptr; + if (auto *P = dyn_cast<til::Project>(CapExpr)) + return P->clangDecl(); + return nullptr; + } + std::string toString() const { if (Negated) return "!" + sx::toString(CapExpr); @@ -422,8 +430,8 @@ private: } private: - BlockInfo(const BlockInfo &) LLVM_DELETED_FUNCTION; - void operator=(const BlockInfo &) LLVM_DELETED_FUNCTION; + BlockInfo(const BlockInfo &) = delete; + void operator=(const BlockInfo &) = delete; }; // We implement the CFGVisitor API diff --git a/include/clang/Analysis/Analyses/ThreadSafetyTIL.h b/include/clang/Analysis/Analyses/ThreadSafetyTIL.h index 2cd8c6d6d2d6..4b5946617dfc 100644 --- a/include/clang/Analysis/Analyses/ThreadSafetyTIL.h +++ b/include/clang/Analysis/Analyses/ThreadSafetyTIL.h @@ -282,7 +282,7 @@ public: /// SExpr objects cannot be deleted. // This declaration is public to workaround a gcc bug that breaks building // with REQUIRES_EH=1. - void operator delete(void *) LLVM_DELETED_FUNCTION; + void operator delete(void *) = delete; /// Returns the instruction ID for this expression. /// All basic block instructions have a unique ID (i.e. virtual register). @@ -309,10 +309,10 @@ protected: BasicBlock* Block; private: - SExpr() LLVM_DELETED_FUNCTION; + SExpr() = delete; /// SExpr objects must be created in an arena. - void *operator new(size_t) LLVM_DELETED_FUNCTION; + void *operator new(size_t) = delete; }; @@ -424,7 +424,7 @@ public: Future() : SExpr(COP_Future), Status(FS_pending), Result(nullptr) {} private: - virtual ~Future() LLVM_DELETED_FUNCTION; + virtual ~Future() = delete; public: // A lazy rewriting strategy should subclass Future and override this method. diff --git a/include/clang/Analysis/Analyses/ThreadSafetyUtil.h b/include/clang/Analysis/Analyses/ThreadSafetyUtil.h index ba3e0e519b09..4d3402f8c00b 100644 --- a/include/clang/Analysis/Analyses/ThreadSafetyUtil.h +++ b/include/clang/Analysis/Analyses/ThreadSafetyUtil.h @@ -130,6 +130,8 @@ public: typedef T *iterator; typedef const T *const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; size_t size() const { return Size; } size_t capacity() const { return Capacity; } @@ -160,6 +162,16 @@ public: const_iterator cbegin() const { return Data; } const_iterator cend() const { return Data + Size; } + reverse_iterator rbegin() { return reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + void push_back(const T &Elem) { assert(Size < Capacity); Data[Size++] = Elem; @@ -188,36 +200,12 @@ public: return J - Osz; } - // An adaptor to reverse a simple array - class ReverseAdaptor { - public: - ReverseAdaptor(SimpleArray &Array) : Array(Array) {} - // A reverse iterator used by the reverse adaptor - class Iterator { - public: - Iterator(T *Data) : Data(Data) {} - T &operator*() { return *Data; } - const T &operator*() const { return *Data; } - Iterator &operator++() { - --Data; - return *this; - } - bool operator!=(Iterator Other) { return Data != Other.Data; } - - private: - T *Data; - }; - Iterator begin() { return Array.end() - 1; } - Iterator end() { return Array.begin() - 1; } - const Iterator begin() const { return Array.end() - 1; } - const Iterator end() const { return Array.begin() - 1; } - - private: - SimpleArray &Array; - }; - - const ReverseAdaptor reverse() const { return ReverseAdaptor(*this); } - ReverseAdaptor reverse() { return ReverseAdaptor(*this); } + llvm::iterator_range<reverse_iterator> reverse() { + return llvm::make_range(rbegin(), rend()); + } + llvm::iterator_range<const_reverse_iterator> reverse() const { + return llvm::make_range(rbegin(), rend()); + } private: // std::max is annoying here, because it requires a reference, @@ -226,7 +214,7 @@ private: static const size_t InitialCapacity = 4; - SimpleArray(const SimpleArray<T> &A) LLVM_DELETED_FUNCTION; + SimpleArray(const SimpleArray<T> &A) = delete; T *Data; size_t Size; @@ -255,8 +243,8 @@ class CopyOnWriteVector { }; // No copy constructor or copy assignment. Use clone() with move assignment. - CopyOnWriteVector(const CopyOnWriteVector &V) LLVM_DELETED_FUNCTION; - void operator=(const CopyOnWriteVector &V) LLVM_DELETED_FUNCTION; + CopyOnWriteVector(const CopyOnWriteVector &V) = delete; + void operator=(const CopyOnWriteVector &V) = delete; public: CopyOnWriteVector() : Data(nullptr) {} |
