mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-02 13:26:06 +00:00

The last argument is expected to be the destination buffer size (or less). Detects if it points to destination buffer size directly or via a variable. Detects if it is an integral, try to detect if the destination buffer can receive the source length. Updating bsd-string.c unit tests as it make it fails now. Reviewers: george.karpenpov, NoQ Reviewed By: george.karpenkov Differential Revision: https://reviews.llvm.org/D48884 llvm-svn: 337499
46 lines
1.3 KiB
C
46 lines
1.3 KiB
C
// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.cstring.NullArg,alpha.unix.cstring,debug.ExprInspection -analyzer-store=region -verify %s
|
|
|
|
#define NULL ((void *)0)
|
|
|
|
typedef __typeof(sizeof(int)) size_t;
|
|
size_t strlcpy(char *dst, const char *src, size_t n);
|
|
size_t strlcat(char *dst, const char *src, size_t n);
|
|
void clang_analyzer_eval(int);
|
|
|
|
void f1() {
|
|
char overlap[] = "123456789";
|
|
strlcpy(overlap, overlap + 1, 3); // expected-warning{{Arguments must not be overlapping buffers}}
|
|
}
|
|
|
|
void f2() {
|
|
char buf[5];
|
|
strlcpy(buf, "abcd", sizeof(buf)); // expected-no-warning
|
|
strlcat(buf, "efgh", sizeof(buf)); // expected-warning{{Size argument is greater than the free space in the destination buffer}}
|
|
}
|
|
|
|
void f3() {
|
|
char dst[2];
|
|
const char *src = "abdef";
|
|
strlcpy(dst, src, 5); // expected-warning{{Size argument is greater than the length of the destination buffer}}
|
|
}
|
|
|
|
void f4() {
|
|
strlcpy(NULL, "abcdef", 6); // expected-warning{{Null pointer argument in call to string copy function}}
|
|
}
|
|
|
|
void f5() {
|
|
strlcat(NULL, "abcdef", 6); // expected-warning{{Null pointer argument in call to string copy function}}
|
|
}
|
|
|
|
void f6() {
|
|
char buf[8];
|
|
strlcpy(buf, "abc", 3);
|
|
size_t len = strlcat(buf, "defg", 4);
|
|
clang_analyzer_eval(len == 7); // expected-warning{{TRUE}}
|
|
}
|
|
|
|
int f7() {
|
|
char buf[8];
|
|
return strlcpy(buf, "1234567", 0); // no-crash
|
|
}
|