xref: /llvm-project/clang/test/Analysis/std-c-library-functions-POSIX.c (revision b85fe40cb88a6b4f640c2b757bd0d254ff1d032c)
1 // RUN: %clang_analyze_cc1 %s \
2 // RUN:   -analyzer-checker=core \
3 // RUN:   -analyzer-checker=unix.StdCLibraryFunctions \
4 // RUN:   -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true \
5 // RUN:   -analyzer-config unix.StdCLibraryFunctions:DisplayLoadedSummaries=true \
6 // RUN:   -analyzer-checker=debug.ExprInspection \
7 // RUN:   -analyzer-config eagerly-assume=false \
8 // RUN:   -triple i686-unknown-linux -verify
9 
10 // RUN: %clang_analyze_cc1 %s \
11 // RUN:   -analyzer-checker=core \
12 // RUN:   -analyzer-checker=unix.StdCLibraryFunctions \
13 // RUN:   -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true \
14 // RUN:   -analyzer-config unix.StdCLibraryFunctions:DisplayLoadedSummaries=true \
15 // RUN:   -analyzer-checker=debug.ExprInspection \
16 // RUN:   -analyzer-config eagerly-assume=false \
17 // RUN:   -triple i686-unknown-linux 2>&1 | FileCheck %s
18 
19 // CHECK: Loaded summary for: FILE *fopen(const char *restrict pathname, const char *restrict mode)
20 // CHECK: Loaded summary for: FILE *fdopen(int fd, const char *mode)
21 // CHECK: Loaded summary for: FILE *tmpfile(void)
22 // CHECK: Loaded summary for: FILE *freopen(const char *restrict pathname, const char *restrict mode, FILE *restrict stream)
23 // CHECK: Loaded summary for: FILE *popen(const char *command, const char *type)
24 // CHECK: Loaded summary for: int fclose(FILE *stream)
25 // CHECK: Loaded summary for: int pclose(FILE *stream)
26 // CHECK: Loaded summary for: int getc(FILE *)
27 // CHECK: Loaded summary for: int fgetc(FILE *)
28 // CHECK: Loaded summary for: int putc(int c, FILE *stream)
29 // CHECK: Loaded summary for: int fputc(int c, FILE *stream)
30 // CHECK: Loaded summary for: char *fgets(char *restrict s, int n, FILE *restrict stream)
31 // CHECK: Loaded summary for: int fputs(const char *restrict s, FILE *restrict stream)
32 // CHECK: Loaded summary for: int fseek(FILE *stream, long offset, int whence)
33 // CHECK: Loaded summary for: int fgetpos(FILE *restrict stream, fpos_t *restrict pos)
34 // CHECK: Loaded summary for: int fsetpos(FILE *stream, const fpos_t *pos)
35 // CHECK: Loaded summary for: int fflush(FILE *stream)
36 // CHECK: Loaded summary for: long ftell(FILE *stream)
37 // CHECK: Loaded summary for: int fileno(FILE *stream)
38 // CHECK: Loaded summary for: void rewind(FILE *stream)
39 // CHECK: Loaded summary for: void clearerr(FILE *stream)
40 // CHECK: Loaded summary for: int feof(FILE *stream)
41 // CHECK: Loaded summary for: int ferror(FILE *stream)
42 // CHECK: Loaded summary for: long a64l(const char *str64)
43 // CHECK: Loaded summary for: char *l64a(long value)
44 // CHECK: Loaded summary for: int open(const char *path, int oflag, ...)
45 // CHECK: Loaded summary for: int openat(int fd, const char *path, int oflag, ...)
46 // CHECK: Loaded summary for: int access(const char *pathname, int amode)
47 // CHECK: Loaded summary for: int faccessat(int dirfd, const char *pathname, int mode, int flags)
48 // CHECK: Loaded summary for: int dup(int fildes)
49 // CHECK: Loaded summary for: int dup2(int fildes1, int filedes2)
50 // CHECK: Loaded summary for: int fdatasync(int fildes)
51 // CHECK: Loaded summary for: int fnmatch(const char *pattern, const char *string, int flags)
52 // CHECK: Loaded summary for: int fsync(int fildes)
53 // CHECK: Loaded summary for: int truncate(const char *path, off_t length)
54 // CHECK: Loaded summary for: int symlink(const char *oldpath, const char *newpath)
55 // CHECK: Loaded summary for: int symlinkat(const char *oldpath, int newdirfd, const char *newpath)
56 // CHECK: Loaded summary for: int lockf(int fd, int cmd, off_t len)
57 // CHECK: Loaded summary for: int creat(const char *pathname, mode_t mode)
58 // CHECK: Loaded summary for: unsigned int sleep(unsigned int seconds)
59 // CHECK: Loaded summary for: int dirfd(DIR *dirp)
60 // CHECK: Loaded summary for: unsigned int alarm(unsigned int seconds)
61 // CHECK: Loaded summary for: int closedir(DIR *dir)
62 // CHECK: Loaded summary for: char *strdup(const char *s)
63 // CHECK: Loaded summary for: char *strndup(const char *s, size_t n)
64 // CHECK: Loaded summary for: int mkstemp(char *template)
65 // CHECK: Loaded summary for: char *mkdtemp(char *template)
66 // CHECK: Loaded summary for: char *getcwd(char *buf, size_t size)
67 // CHECK: Loaded summary for: int mkdir(const char *pathname, mode_t mode)
68 // CHECK: Loaded summary for: int mkdirat(int dirfd, const char *pathname, mode_t mode)
69 // CHECK: Loaded summary for: int mknod(const char *pathname, mode_t mode, dev_t dev)
70 // CHECK: Loaded summary for: int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev)
71 // CHECK: Loaded summary for: int chmod(const char *path, mode_t mode)
72 // CHECK: Loaded summary for: int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags)
73 // CHECK: Loaded summary for: int fchmod(int fildes, mode_t mode)
74 // CHECK: Loaded summary for: int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags)
75 // CHECK: Loaded summary for: int chown(const char *path, uid_t owner, gid_t group)
76 // CHECK: Loaded summary for: int lchown(const char *path, uid_t owner, gid_t group)
77 // CHECK: Loaded summary for: int fchown(int fildes, uid_t owner, gid_t group)
78 // CHECK: Loaded summary for: int rmdir(const char *pathname)
79 // CHECK: Loaded summary for: int chdir(const char *path)
80 // CHECK: Loaded summary for: int link(const char *oldpath, const char *newpath)
81 // CHECK: Loaded summary for: int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag)
82 // CHECK: Loaded summary for: int unlink(const char *pathname)
83 // CHECK: Loaded summary for: int unlinkat(int fd, const char *path, int flag)
84 // CHECK: Loaded summary for: int fstat(int fd, struct stat *statbuf)
85 // CHECK: Loaded summary for: int stat(const char *restrict path, struct stat *restrict buf)
86 // CHECK: Loaded summary for: int lstat(const char *restrict path, struct stat *restrict buf)
87 // CHECK: Loaded summary for: int fstatat(int fd, const char *restrict path, struct stat *restrict buf, int flag)
88 // CHECK: Loaded summary for: DIR *opendir(const char *name)
89 // CHECK: Loaded summary for: DIR *fdopendir(int fd)
90 // CHECK: Loaded summary for: int isatty(int fildes)
91 // CHECK: Loaded summary for: int close(int fildes)
92 // CHECK: Loaded summary for: long fpathconf(int fildes, int name)
93 // CHECK: Loaded summary for: long pathconf(const char *path, int name)
94 // CHECK: Loaded summary for: void rewinddir(DIR *dir)
95 // CHECK: Loaded summary for: void seekdir(DIR *dirp, long loc)
96 // CHECK: Loaded summary for: int rand_r(unsigned int *seedp)
97 // CHECK: Loaded summary for: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
98 // CHECK: Loaded summary for: void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset)
99 // CHECK: Loaded summary for: int pipe(int fildes[2])
100 // CHECK: Loaded summary for: off_t lseek(int fildes, off_t offset, int whence)
101 // CHECK: Loaded summary for: ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
102 // CHECK: Loaded summary for: ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize)
103 // CHECK: Loaded summary for: int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath)
104 // CHECK: Loaded summary for: char *realpath(const char *restrict file_name, char *restrict resolved_name)
105 // CHECK: Loaded summary for: int execv(const char *path, char *const argv[])
106 // CHECK: Loaded summary for: int execvp(const char *file, char *const argv[])
107 // CHECK: Loaded summary for: int getopt(int argc, char *const argv[], const char *optstring)
108 // CHECK: Loaded summary for: int socket(int domain, int type, int protocol)
109 // CHECK: Loaded summary for: int accept(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len)
110 // CHECK: Loaded summary for: int bind(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len)
111 // CHECK: Loaded summary for: int getpeername(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len)
112 // CHECK: Loaded summary for: int getsockname(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len)
113 // CHECK: Loaded summary for: int connect(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len)
114 // CHECK: Loaded summary for: ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, __SOCKADDR_ARG address, socklen_t *restrict address_len)
115 // CHECK: Loaded summary for: ssize_t sendto(int socket, const void *message, size_t length, int flags, __CONST_SOCKADDR_ARG dest_addr, socklen_t dest_len)
116 // CHECK: Loaded summary for: int listen(int sockfd, int backlog)
117 // CHECK: Loaded summary for: ssize_t recv(int sockfd, void *buf, size_t len, int flags)
118 // CHECK: Loaded summary for: ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
119 // CHECK: Loaded summary for: ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
120 // CHECK: Loaded summary for: int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len)
121 // CHECK: Loaded summary for: int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len)
122 // CHECK: Loaded summary for: ssize_t send(int sockfd, const void *buf, size_t len, int flags)
123 // CHECK: Loaded summary for: int socketpair(int domain, int type, int protocol, int sv[2])
124 // CHECK: Loaded summary for: int shutdown(int socket, int how)
125 // CHECK: Loaded summary for: int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags)
126 // CHECK: Loaded summary for: int utime(const char *filename, struct utimbuf *buf)
127 // CHECK: Loaded summary for: int futimens(int fd, const struct timespec times[2])
128 // CHECK: Loaded summary for: int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags)
129 // CHECK: Loaded summary for: int utimes(const char *filename, const struct timeval times[2])
130 // CHECK: Loaded summary for: int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
131 // CHECK: Loaded summary for: struct tm *localtime(const time_t *tp)
132 // CHECK: Loaded summary for: struct tm *localtime_r(const time_t *restrict timer, struct tm *restrict result)
133 // CHECK: Loaded summary for: char *asctime_r(const struct tm *restrict tm, char *restrict buf)
134 // CHECK: Loaded summary for: char *ctime_r(const time_t *timep, char *buf)
135 // CHECK: Loaded summary for: struct tm *gmtime_r(const time_t *restrict timer, struct tm *restrict result)
136 // CHECK: Loaded summary for: struct tm *gmtime(const time_t *tp)
137 // CHECK: Loaded summary for: int clock_gettime(clockid_t clock_id, struct timespec *tp)
138 // CHECK: Loaded summary for: int getitimer(int which, struct itimerval *curr_value)
139 // CHECK: Loaded summary for: int pthread_cond_signal(pthread_cond_t *cond)
140 // CHECK: Loaded summary for: int pthread_cond_broadcast(pthread_cond_t *cond)
141 // CHECK: Loaded summary for: int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg)
142 // CHECK: Loaded summary for: int pthread_attr_destroy(pthread_attr_t *attr)
143 // CHECK: Loaded summary for: int pthread_attr_init(pthread_attr_t *attr)
144 // CHECK: Loaded summary for: int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize)
145 // CHECK: Loaded summary for: int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize)
146 // CHECK: Loaded summary for: int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
147 // CHECK: Loaded summary for: int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize)
148 // CHECK: Loaded summary for: int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr)
149 // CHECK: Loaded summary for: int pthread_mutex_destroy(pthread_mutex_t *mutex)
150 // CHECK: Loaded summary for: int pthread_mutex_lock(pthread_mutex_t *mutex)
151 // CHECK: Loaded summary for: int pthread_mutex_trylock(pthread_mutex_t *mutex)
152 // CHECK: Loaded summary for: int pthread_mutex_unlock(pthread_mutex_t *mutex)
153 
154 #include "Inputs/std-c-library-functions-POSIX.h"
155 
156 void clang_analyzer_eval(int);
157 
test_open(void)158 void test_open(void) {
159   open(0, 0); // \
160   // expected-warning{{The 1st argument to 'open' is NULL but should not be NULL}}
161 }
162 
test_open_additional_arg(void)163 void test_open_additional_arg(void) {
164   open(0, 0, 0); // \
165   // expected-warning{{The 1st argument to 'open' is NULL but should not be NULL}}
166 }
167 
test_recvfrom(int socket,void * restrict buffer,size_t length,int flags,struct sockaddr * restrict address,socklen_t * restrict address_len)168 void test_recvfrom(int socket, void *restrict buffer, size_t length, int flags,
169                    struct sockaddr *restrict address,
170                    socklen_t *restrict address_len) {
171   ssize_t Ret = recvfrom(socket, buffer, length, flags, address, address_len);
172   if (Ret == 0)
173     clang_analyzer_eval(length == 0); // expected-warning{{TRUE}}
174   if (Ret > 0)
175     clang_analyzer_eval(length > 0); // expected-warning{{TRUE}}
176   if (Ret == -1)
177     clang_analyzer_eval(length == 0); // expected-warning{{UNKNOWN}}
178 }
179 
test_sendto(int socket,const void * message,size_t length,int flags,const struct sockaddr * dest_addr,socklen_t dest_len)180 void test_sendto(int socket, const void *message, size_t length, int flags,
181                  const struct sockaddr *dest_addr, socklen_t dest_len) {
182   ssize_t Ret = sendto(socket, message, length, flags, dest_addr, dest_len);
183   if (Ret == 0)
184     clang_analyzer_eval(length == 0); // expected-warning{{TRUE}}
185   if (Ret > 0)
186     clang_analyzer_eval(length > 0); // expected-warning{{TRUE}}
187   if (Ret == -1)
188     clang_analyzer_eval(length == 0); // expected-warning{{UNKNOWN}}
189 }
190 
test_recv(int sockfd,void * buf,size_t len,int flags)191 void test_recv(int sockfd, void *buf, size_t len, int flags) {
192   ssize_t Ret = recv(sockfd, buf, len, flags);
193   if (Ret == 0)
194     clang_analyzer_eval(len == 0); // expected-warning{{TRUE}}
195   if (Ret > 0)
196     clang_analyzer_eval(len > 0); // expected-warning{{TRUE}}
197   if (Ret == -1)
198     clang_analyzer_eval(len == 0); // expected-warning{{UNKNOWN}}
199 }
200 
test_send(int sockfd,void * buf,size_t len,int flags)201 void test_send(int sockfd, void *buf, size_t len, int flags) {
202   ssize_t Ret = send(sockfd, buf, len, flags);
203   if (Ret == 0)
204     clang_analyzer_eval(len == 0); // expected-warning{{TRUE}}
205   if (Ret > 0)
206     clang_analyzer_eval(len > 0); // expected-warning{{TRUE}}
207   if (Ret == -1)
208     clang_analyzer_eval(len == 0); // expected-warning{{UNKNOWN}}
209 }
210 
test_recvmsg(int sockfd,struct msghdr * msg,int flags)211 void test_recvmsg(int sockfd, struct msghdr *msg, int flags) {
212   ssize_t Ret = recvmsg(sockfd, msg, flags);
213   clang_analyzer_eval(Ret != 0); // expected-warning{{TRUE}}
214 }
215 
test_sendmsg(int sockfd,const struct msghdr * msg,int flags)216 void test_sendmsg(int sockfd, const struct msghdr *msg, int flags) {
217   ssize_t Ret = sendmsg(sockfd, msg, flags);
218   clang_analyzer_eval(Ret != 0); // expected-warning{{TRUE}}
219 }
220 
test_readlink_bufsize_zero(char * Buf,size_t Bufsize)221 void test_readlink_bufsize_zero(char *Buf, size_t Bufsize) {
222   ssize_t Ret = readlink("path", Buf, Bufsize);
223   if (Ret == 0)
224     clang_analyzer_eval(Bufsize == 0); // expected-warning{{TRUE}}
225   else if (Ret > 0)
226     clang_analyzer_eval(Bufsize == 0); // expected-warning{{FALSE}}
227   else
228     clang_analyzer_eval(Bufsize == 0); // expected-warning{{UNKNOWN}}
229 }
230 
test_readlinkat_bufsize_zero(int fd,char * Buf,size_t Bufsize)231 void test_readlinkat_bufsize_zero(int fd, char *Buf, size_t Bufsize) {
232   ssize_t Ret = readlinkat(fd, "path", Buf, Bufsize);
233   if (Ret == 0)
234     clang_analyzer_eval(Bufsize == 0); // expected-warning{{TRUE}}
235   else if (Ret > 0)
236     clang_analyzer_eval(Bufsize == 0); // expected-warning{{FALSE}}
237   else
238     clang_analyzer_eval(Bufsize == 0); // expected-warning{{UNKNOWN}}
239 }
240