Skip to content

Commit 1214014

Browse files
committed
[analyzer] Support kfree in MallocChecker
Summary: kmalloc is freed with kfree in the linux kernel. kmalloc support was added in r204832, but kfree was not. Adding kfree fixes incorrectly detected memory leaks. Reviewers: NoQ, nickdesaulniers, dcoughlin, Szelethus Reviewed By: NoQ, Szelethus Subscribers: xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, Szelethus, donat.nagy, dkrupp, Charusso, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64030 llvm-svn: 364875
1 parent d66c606 commit 1214014

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,10 @@ class MallocChecker : public Checker<check::DeadSymbols,
177177
II_free(nullptr), II_realloc(nullptr), II_calloc(nullptr),
178178
II_valloc(nullptr), II_reallocf(nullptr), II_strndup(nullptr),
179179
II_strdup(nullptr), II_win_strdup(nullptr), II_kmalloc(nullptr),
180-
II_if_nameindex(nullptr), II_if_freenameindex(nullptr),
181-
II_wcsdup(nullptr), II_win_wcsdup(nullptr), II_g_malloc(nullptr),
182-
II_g_malloc0(nullptr), II_g_realloc(nullptr), II_g_try_malloc(nullptr),
180+
II_kfree(nullptr), II_if_nameindex(nullptr),
181+
II_if_freenameindex(nullptr), II_wcsdup(nullptr),
182+
II_win_wcsdup(nullptr), II_g_malloc(nullptr), II_g_malloc0(nullptr),
183+
II_g_realloc(nullptr), II_g_try_malloc(nullptr),
183184
II_g_try_malloc0(nullptr), II_g_try_realloc(nullptr),
184185
II_g_free(nullptr), II_g_memdup(nullptr), II_g_malloc_n(nullptr),
185186
II_g_malloc0_n(nullptr), II_g_realloc_n(nullptr),
@@ -249,13 +250,13 @@ class MallocChecker : public Checker<check::DeadSymbols,
249250
mutable IdentifierInfo *II_alloca, *II_win_alloca, *II_malloc, *II_free,
250251
*II_realloc, *II_calloc, *II_valloc, *II_reallocf,
251252
*II_strndup, *II_strdup, *II_win_strdup, *II_kmalloc,
252-
*II_if_nameindex, *II_if_freenameindex, *II_wcsdup,
253-
*II_win_wcsdup, *II_g_malloc, *II_g_malloc0,
254-
*II_g_realloc, *II_g_try_malloc, *II_g_try_malloc0,
255-
*II_g_try_realloc, *II_g_free, *II_g_memdup,
256-
*II_g_malloc_n, *II_g_malloc0_n, *II_g_realloc_n,
257-
*II_g_try_malloc_n, *II_g_try_malloc0_n,
258-
*II_g_try_realloc_n;
253+
*II_kfree, *II_if_nameindex, *II_if_freenameindex,
254+
*II_wcsdup, *II_win_wcsdup, *II_g_malloc,
255+
*II_g_malloc0, *II_g_realloc, *II_g_try_malloc,
256+
*II_g_try_malloc0, *II_g_try_realloc, *II_g_free,
257+
*II_g_memdup, *II_g_malloc_n, *II_g_malloc0_n,
258+
*II_g_realloc_n, *II_g_try_malloc_n,
259+
*II_g_try_malloc0_n, *II_g_try_realloc_n;
259260
mutable Optional<uint64_t> KernelZeroFlagVal;
260261

261262
void initIdentifierInfo(ASTContext &C) const;
@@ -598,6 +599,7 @@ void MallocChecker::initIdentifierInfo(ASTContext &Ctx) const {
598599
II_strndup = &Ctx.Idents.get("strndup");
599600
II_wcsdup = &Ctx.Idents.get("wcsdup");
600601
II_kmalloc = &Ctx.Idents.get("kmalloc");
602+
II_kfree = &Ctx.Idents.get("kfree");
601603
II_if_nameindex = &Ctx.Idents.get("if_nameindex");
602604
II_if_freenameindex = &Ctx.Idents.get("if_freenameindex");
603605

@@ -657,7 +659,7 @@ bool MallocChecker::isCMemFunction(const FunctionDecl *FD,
657659

658660
if (Family == AF_Malloc && CheckFree) {
659661
if (FunI == II_free || FunI == II_realloc || FunI == II_reallocf ||
660-
FunI == II_g_free)
662+
FunI == II_g_free || FunI == II_kfree)
661663
return true;
662664
}
663665

@@ -874,7 +876,7 @@ void MallocChecker::checkPostStmt(const CallExpr *CE, CheckerContext &C) const {
874876
State = CallocMem(C, CE, State);
875877
State = ProcessZeroAllocation(C, CE, 0, State);
876878
State = ProcessZeroAllocation(C, CE, 1, State);
877-
} else if (FunI == II_free || FunI == II_g_free) {
879+
} else if (FunI == II_free || FunI == II_g_free || FunI == II_kfree) {
878880
State = FreeMemAux(C, CE, State, 0, false, ReleasedAllocatedMemory);
879881
} else if (FunI == II_strdup || FunI == II_win_strdup ||
880882
FunI == II_wcsdup || FunI == II_win_wcsdup) {

clang/test/Analysis/kmalloc-linux.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void test_zeroed() {
2424
t = list[i];
2525
foo(t);
2626
}
27-
free(list); // no-warning
27+
kfree(list); // no-warning
2828
}
2929

3030
void test_nonzero() {
@@ -39,7 +39,7 @@ void test_nonzero() {
3939
t = list[i]; // expected-warning{{undefined}}
4040
foo(t);
4141
}
42-
free(list);
42+
kfree(list);
4343
}
4444

4545
void test_indeterminate(int flags) {
@@ -54,5 +54,5 @@ void test_indeterminate(int flags) {
5454
t = list[i]; // expected-warning{{undefined}}
5555
foo(t);
5656
}
57-
free(list);
57+
kfree(list);
5858
}

0 commit comments

Comments
 (0)