[clang] Fixed issue #128882: don't warn if 1st argument to 'getcwd' is NULL (PR #135720)
Balazs Benics via cfe-commits
cfe-commits at lists.llvm.org
Tue May 20 03:06:51 PDT 2025
https://github.com/steakhal updated https://github.com/llvm/llvm-project/pull/135720
>From cfd32680ac4a534b4060d8cc3549edfe45e721bf Mon Sep 17 00:00:00 2001
From: Sean McBride <sean at rogue-research.com>
Date: Mon, 14 Apr 2025 20:58:24 -0400
Subject: [PATCH 1/2] Fixed issue #128882: don't warn if 1st argument to
'getcwd' is NULL
---
.../lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | 1 -
clang/test/Analysis/errno-stdlibraryfunctions.c | 3 ---
2 files changed, 4 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
index 9c0b79ab58618..34bab80307a04 100644
--- a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
@@ -2663,7 +2663,6 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
.Case({ArgumentCondition(1, WithinRange, Range(1, SizeMax)),
IsNull(Ret)},
ErrnoNEZeroIrrelevant, GenericFailureMsg)
- .ArgConstraint(NotNull(ArgNo(0)))
.ArgConstraint(
BufferSize(/*Buffer*/ ArgNo(0), /*BufSize*/ ArgNo(1)))
.ArgConstraint(
diff --git a/clang/test/Analysis/errno-stdlibraryfunctions.c b/clang/test/Analysis/errno-stdlibraryfunctions.c
index 657aa37a42670..0bc82b595eed8 100644
--- a/clang/test/Analysis/errno-stdlibraryfunctions.c
+++ b/clang/test/Analysis/errno-stdlibraryfunctions.c
@@ -105,9 +105,6 @@ void errno_getcwd(char *Buf, size_t Sz) {
clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
clang_analyzer_eval(Path == NULL); // expected-warning{{TRUE}}
if (errno) {} // no warning
- } else if (Path == NULL) {
- clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
- if (errno) {} // no warning
} else {
clang_analyzer_eval(Path == Buf); // expected-warning{{TRUE}}
if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}}
>From 039952f6517c6e732fb5ce578291a35668c46c7b Mon Sep 17 00:00:00 2001
From: Balazs Benics <benicsbalazs at gmail.com>
Date: Tue, 20 May 2025 12:05:00 +0200
Subject: [PATCH 2/2] Add NotNull constaints to arg 0 for the summary Cases
---
.../Checkers/StdLibraryFunctionsChecker.cpp | 9 ++++++---
clang/test/Analysis/errno-stdlibraryfunctions.c | 10 ++++++++++
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
index 54583ce54a45e..8ee616f5ed37e 100644
--- a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
@@ -2651,13 +2651,16 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
addToFunctionSummaryMap(
"getcwd", Signature(ArgTypes{CharPtrTy, SizeTy}, RetType{CharPtrTy}),
Summary(NoEvalCall)
- .Case({ArgumentCondition(1, WithinRange, Range(1, SizeMax)),
+ .Case({NotNull(ArgNo(0)),
+ ArgumentCondition(1, WithinRange, Range(1, SizeMax)),
ReturnValueCondition(BO_EQ, ArgNo(0))},
ErrnoMustNotBeChecked, GenericSuccessMsg)
- .Case({ArgumentCondition(1, WithinRange, SingleValue(0)),
+ .Case({NotNull(ArgNo(0)),
+ ArgumentCondition(1, WithinRange, SingleValue(0)),
IsNull(Ret)},
ErrnoNEZeroIrrelevant, "Assuming that argument 'size' is 0")
- .Case({ArgumentCondition(1, WithinRange, Range(1, SizeMax)),
+ .Case({NotNull(ArgNo(0)),
+ ArgumentCondition(1, WithinRange, Range(1, SizeMax)),
IsNull(Ret)},
ErrnoNEZeroIrrelevant, GenericFailureMsg)
.ArgConstraint(
diff --git a/clang/test/Analysis/errno-stdlibraryfunctions.c b/clang/test/Analysis/errno-stdlibraryfunctions.c
index 0bc82b595eed8..84809751e1eee 100644
--- a/clang/test/Analysis/errno-stdlibraryfunctions.c
+++ b/clang/test/Analysis/errno-stdlibraryfunctions.c
@@ -8,6 +8,7 @@
#include "Inputs/errno_var.h"
#include "Inputs/std-c-library-functions-POSIX.h"
+#include "Inputs/system-header-simulator-for-malloc.h"
#define NULL ((void *) 0)
@@ -105,12 +106,21 @@ void errno_getcwd(char *Buf, size_t Sz) {
clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
clang_analyzer_eval(Path == NULL); // expected-warning{{TRUE}}
if (errno) {} // no warning
+ } else if (Path == NULL) {
+ clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
+ if (errno) {} // no warning
} else {
clang_analyzer_eval(Path == Buf); // expected-warning{{TRUE}}
if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}}
}
}
+void gh_128882_getcwd(void) {
+ // We expect no warnings here.
+ char* currentPath = getcwd(NULL, 0);
+ free(currentPath);
+}
+
void errno_execv(char *Path, char * Argv[]) {
int Ret = execv(Path, Argv);
clang_analyzer_eval(Ret == -1); // expected-warning{{TRUE}}
More information about the cfe-commits
mailing list