diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-08-02 17:33:11 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-08-02 17:33:11 +0000 | 
| commit | c7e70c433efc6953dc3888b9fbf9f3512d7da2b0 (patch) | |
| tree | 27425930fc0c91650a7f3527fcac8e0f92907b90 /lib/StaticAnalyzer/Checkers/MallocChecker.cpp | |
| parent | 486754660bb926339aefcf012a3f848592babb8b (diff) | |
Notes
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/MallocChecker.cpp')
| -rw-r--r-- | lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 43 | 
1 files changed, 24 insertions, 19 deletions
| diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 8f07f413e81f..ebaf79a780c0 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -179,11 +179,11 @@ public:          II_strdup(nullptr), II_win_strdup(nullptr), II_kmalloc(nullptr),          II_if_nameindex(nullptr), II_if_freenameindex(nullptr),          II_wcsdup(nullptr), II_win_wcsdup(nullptr), II_g_malloc(nullptr), -        II_g_malloc0(nullptr), II_g_realloc(nullptr), II_g_try_malloc(nullptr),  -        II_g_try_malloc0(nullptr), II_g_try_realloc(nullptr),  -        II_g_free(nullptr), II_g_memdup(nullptr), II_g_malloc_n(nullptr),  -        II_g_malloc0_n(nullptr), II_g_realloc_n(nullptr),  -        II_g_try_malloc_n(nullptr), II_g_try_malloc0_n(nullptr),  +        II_g_malloc0(nullptr), II_g_realloc(nullptr), II_g_try_malloc(nullptr), +        II_g_try_malloc0(nullptr), II_g_try_realloc(nullptr), +        II_g_free(nullptr), II_g_memdup(nullptr), II_g_malloc_n(nullptr), +        II_g_malloc0_n(nullptr), II_g_realloc_n(nullptr), +        II_g_try_malloc_n(nullptr), II_g_try_malloc0_n(nullptr),          II_g_try_realloc_n(nullptr) {}    /// In pessimistic mode, the checker assumes that it does not know which @@ -248,11 +248,11 @@ private:                           *II_realloc, *II_calloc, *II_valloc, *II_reallocf,                           *II_strndup, *II_strdup, *II_win_strdup, *II_kmalloc,                           *II_if_nameindex, *II_if_freenameindex, *II_wcsdup, -                         *II_win_wcsdup, *II_g_malloc, *II_g_malloc0,  -                         *II_g_realloc, *II_g_try_malloc, *II_g_try_malloc0,  -                         *II_g_try_realloc, *II_g_free, *II_g_memdup,  -                         *II_g_malloc_n, *II_g_malloc0_n, *II_g_realloc_n,  -                         *II_g_try_malloc_n, *II_g_try_malloc0_n,  +                         *II_win_wcsdup, *II_g_malloc, *II_g_malloc0, +                         *II_g_realloc, *II_g_try_malloc, *II_g_try_malloc0, +                         *II_g_try_realloc, *II_g_free, *II_g_memdup, +                         *II_g_malloc_n, *II_g_malloc0_n, *II_g_realloc_n, +                         *II_g_try_malloc_n, *II_g_try_malloc0_n,                           *II_g_try_realloc_n;    mutable Optional<uint64_t> KernelZeroFlagVal; @@ -346,7 +346,7 @@ private:    ProgramStateRef ReallocMemAux(CheckerContext &C, const CallExpr *CE,                                  bool FreesMemOnFailure, -                                ProgramStateRef State,  +                                ProgramStateRef State,                                  bool SuffixWithN = false) const;    static SVal evalMulForBufferSize(CheckerContext &C, const Expr *Blocks,                                     const Expr *BlockBytes); @@ -652,7 +652,7 @@ bool MallocChecker::isCMemFunction(const FunctionDecl *FD,      initIdentifierInfo(C);      if (Family == AF_Malloc && CheckFree) { -      if (FunI == II_free || FunI == II_realloc || FunI == II_reallocf ||  +      if (FunI == II_free || FunI == II_realloc || FunI == II_reallocf ||            FunI == II_g_free)          return true;      } @@ -662,12 +662,12 @@ bool MallocChecker::isCMemFunction(const FunctionDecl *FD,            FunI == II_calloc || FunI == II_valloc || FunI == II_strdup ||            FunI == II_win_strdup || FunI == II_strndup || FunI == II_wcsdup ||            FunI == II_win_wcsdup || FunI == II_kmalloc || -          FunI == II_g_malloc || FunI == II_g_malloc0 ||  -          FunI == II_g_realloc || FunI == II_g_try_malloc ||  +          FunI == II_g_malloc || FunI == II_g_malloc0 || +          FunI == II_g_realloc || FunI == II_g_try_malloc ||            FunI == II_g_try_malloc0 || FunI == II_g_try_realloc || -          FunI == II_g_memdup || FunI == II_g_malloc_n ||  -          FunI == II_g_malloc0_n || FunI == II_g_realloc_n ||  -          FunI == II_g_try_malloc_n || FunI == II_g_try_malloc0_n ||  +          FunI == II_g_memdup || FunI == II_g_malloc_n || +          FunI == II_g_malloc0_n || FunI == II_g_realloc_n || +          FunI == II_g_try_malloc_n || FunI == II_g_try_malloc0_n ||            FunI == II_g_try_realloc_n)          return true;      } @@ -873,7 +873,7 @@ void MallocChecker::checkPostStmt(const CallExpr *CE, CheckerContext &C) const {          return;        State = MallocMemAux(C, CE, CE->getArg(0), UndefinedVal(), State);        State = ProcessZeroAllocation(C, CE, 0, State); -    } else if (FunI == II_realloc || FunI == II_g_realloc ||  +    } else if (FunI == II_realloc || FunI == II_g_realloc ||                 FunI == II_g_try_realloc) {        State = ReallocMemAux(C, CE, false, State);        State = ProcessZeroAllocation(C, CE, 1, State); @@ -936,7 +936,7 @@ void MallocChecker::checkPostStmt(const CallExpr *CE, CheckerContext &C) const {          return;        State = MallocMemAux(C, CE, CE->getArg(1), UndefinedVal(), State);        State = ProcessZeroAllocation(C, CE, 1, State); -    } else if (FunI == II_g_malloc_n || FunI == II_g_try_malloc_n ||  +    } else if (FunI == II_g_malloc_n || FunI == II_g_try_malloc_n ||                 FunI == II_g_malloc0_n || FunI == II_g_try_malloc0_n) {        if (CE->getNumArgs() < 2)          return; @@ -2930,6 +2930,11 @@ std::shared_ptr<PathDiagnosticPiece> MallocChecker::MallocBugVisitor::VisitNode(                OS << MemCallE->getMethodDecl()->getNameAsString();              } else if (const auto *OpCallE = dyn_cast<CXXOperatorCallExpr>(S)) {                OS << OpCallE->getDirectCallee()->getNameAsString(); +            } else if (const auto *CallE = dyn_cast<CallExpr>(S)) { +              auto &CEMgr = BRC.getStateManager().getCallEventManager(); +              CallEventRef<> Call = CEMgr.getSimpleCall(CallE, state, CurrentLC); +              const auto *D = dyn_cast_or_null<NamedDecl>(Call->getDecl()); +              OS << (D ? D->getNameAsString() : "unknown");              }              OS << "'";            } | 
