blob: c2c98df86489910347fe094f3393470d727458c1 [file] [log] [blame]
Gabor Martondb4d5f72020-06-22 11:00:02 +02001// RUN: %clang_analyze_cc1 %s \
2// RUN: -analyzer-checker=core \
3// RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \
4// RUN: -analyzer-config apiModeling.StdCLibraryFunctions:ModelPOSIX=true \
5// RUN: -analyzer-config apiModeling.StdCLibraryFunctions:DisplayLoadedSummaries=true \
6// RUN: -analyzer-checker=debug.ExprInspection \
7// RUN: -analyzer-config eagerly-assume=false \
8// RUN: -triple i686-unknown-linux 2>&1 | FileCheck %s
9
10// CHECK: Loaded summary for: long a64l(const char *str64)
11// CHECK: Loaded summary for: char *l64a(long value)
12// CHECK: Loaded summary for: int access(const char *pathname, int amode)
13// CHECK: Loaded summary for: int faccessat(int dirfd, const char *pathname, int mode, int flags)
14// CHECK: Loaded summary for: int dup(int fildes)
15// CHECK: Loaded summary for: int dup2(int fildes1, int filedes2)
16// CHECK: Loaded summary for: int fdatasync(int fildes)
17// CHECK: Loaded summary for: int fnmatch(const char *pattern, const char *string, int flags)
18// CHECK: Loaded summary for: int fsync(int fildes)
19// CHECK: Loaded summary for: int truncate(const char *path, off_t length)
20// CHECK: Loaded summary for: int symlink(const char *oldpath, const char *newpath)
21// CHECK: Loaded summary for: int symlinkat(const char *oldpath, int newdirfd, const char *newpath)
22// CHECK: Loaded summary for: int lockf(int fd, int cmd, off_t len)
23// CHECK: Loaded summary for: int creat(const char *pathname, mode_t mode)
24// CHECK: Loaded summary for: unsigned int sleep(unsigned int seconds)
25// CHECK: Loaded summary for: int dirfd(DIR *dirp)
26// CHECK: Loaded summary for: unsigned int alarm(unsigned int seconds)
27// CHECK: Loaded summary for: int closedir(DIR *dir)
28// CHECK: Loaded summary for: char *strdup(const char *s)
29// CHECK: Loaded summary for: char *strndup(const char *s, size_t n)
30// CHECK: Loaded summary for: int mkstemp(char *template)
31// CHECK: Loaded summary for: char *mkdtemp(char *template)
32// CHECK: Loaded summary for: char *getcwd(char *buf, size_t size)
33// CHECK: Loaded summary for: int mkdir(const char *pathname, mode_t mode)
34// CHECK: Loaded summary for: int mkdirat(int dirfd, const char *pathname, mode_t mode)
35// CHECK: Loaded summary for: int mknod(const char *pathname, mode_t mode, dev_t dev)
36// CHECK: Loaded summary for: int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev)
37// CHECK: Loaded summary for: int chmod(const char *path, mode_t mode)
38// CHECK: Loaded summary for: int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags)
39// CHECK: Loaded summary for: int fchmod(int fildes, mode_t mode)
40// CHECK: Loaded summary for: int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags)
41// CHECK: Loaded summary for: int chown(const char *path, uid_t owner, gid_t group)
42// CHECK: Loaded summary for: int lchown(const char *path, uid_t owner, gid_t group)
43// CHECK: Loaded summary for: int fchown(int fildes, uid_t owner, gid_t group)
44// CHECK: Loaded summary for: int rmdir(const char *pathname)
45// CHECK: Loaded summary for: int chdir(const char *path)
46// CHECK: Loaded summary for: int link(const char *oldpath, const char *newpath)
47// CHECK: Loaded summary for: int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag)
48// CHECK: Loaded summary for: int unlink(const char *pathname)
49// CHECK: Loaded summary for: int unlinkat(int fd, const char *path, int flag)
50// CHECK: Loaded summary for: int fstat(int fd, struct stat *statbuf)
51// CHECK: Loaded summary for: int stat(const char *restrict path, struct stat *restrict buf)
52// CHECK: Loaded summary for: int lstat(const char *restrict path, struct stat *restrict buf)
53// CHECK: Loaded summary for: int fstatat(int fd, const char *restrict path, struct stat *restrict buf, int flag)
54// CHECK: Loaded summary for: DIR *opendir(const char *name)
55// CHECK: Loaded summary for: DIR *fdopendir(int fd)
56// CHECK: Loaded summary for: int isatty(int fildes)
57// CHECK: Loaded summary for: FILE *popen(const char *command, const char *type)
58// CHECK: Loaded summary for: int pclose(FILE *stream)
59// CHECK: Loaded summary for: int close(int fildes)
60// CHECK: Loaded summary for: long fpathconf(int fildes, int name)
61// CHECK: Loaded summary for: long pathconf(const char *path, int name)
62// CHECK: Loaded summary for: FILE *fdopen(int fd, const char *mode)
63// CHECK: Loaded summary for: void rewinddir(DIR *dir)
64// CHECK: Loaded summary for: void seekdir(DIR *dirp, long loc)
65// CHECK: Loaded summary for: int rand_r(unsigned int *seedp)
66// CHECK: Loaded summary for: int strcasecmp(const char *s1, const char *s2)
67// CHECK: Loaded summary for: int strncasecmp(const char *s1, const char *s2, size_t n)
68// CHECK: Loaded summary for: int fileno(FILE *stream)
69// CHECK: Loaded summary for: int fseeko(FILE *stream, off_t offset, int whence)
70// CHECK: Loaded summary for: off_t ftello(FILE *stream)
71// CHECK: Loaded summary for: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
72// CHECK: Loaded summary for: void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset)
73// CHECK: Loaded summary for: int pipe(int fildes[2])
74// CHECK: Loaded summary for: off_t lseek(int fildes, off_t offset, int whence)
75// CHECK: Loaded summary for: ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
76// CHECK: Loaded summary for: ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize)
77// CHECK: Loaded summary for: int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath)
78// CHECK: Loaded summary for: char *realpath(const char *restrict file_name, char *restrict resolved_name)
79// CHECK: Loaded summary for: int execv(const char *path, char *const argv[])
80// CHECK: Loaded summary for: int execvp(const char *file, char *const argv[])
81// CHECK: Loaded summary for: int getopt(int argc, char *const argv[], const char *optstring)
Gabor Marton3ff220d2020-07-07 18:34:20 +020082// CHECK: Loaded summary for: int accept(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len)
83// CHECK: Loaded summary for: int bind(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len)
84// CHECK: Loaded summary for: int getpeername(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len)
85// CHECK: Loaded summary for: int getsockname(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len)
86// CHECK: Loaded summary for: int connect(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len)
87// 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)
88// 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)
89// CHECK: Loaded summary for: int listen(int sockfd, int backlog)
90// CHECK: Loaded summary for: ssize_t recv(int sockfd, void *buf, size_t len, int flags)
91// CHECK: Loaded summary for: ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
92// CHECK: Loaded summary for: ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
93// CHECK: Loaded summary for: int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len)
94// CHECK: Loaded summary for: int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len)
95// CHECK: Loaded summary for: ssize_t send(int sockfd, const void *buf, size_t len, int flags)
96// CHECK: Loaded summary for: int socketpair(int domain, int type, int protocol, int sv[2])
97// 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)
Gabor Martonf0b9dbc2020-07-21 18:50:43 +020098// CHECK: Loaded summary for: int utime(const char *filename, struct utimbuf *buf)
99// CHECK: Loaded summary for: int futimens(int fd, const struct timespec times[2])
100// CHECK: Loaded summary for: int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags)
101// CHECK: Loaded summary for: int utimes(const char *filename, const struct timeval times[2])
102// CHECK: Loaded summary for: int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
103// CHECK: Loaded summary for: struct tm *localtime(const time_t *tp)
104// CHECK: Loaded summary for: struct tm *localtime_r(const time_t *restrict timer, struct tm *restrict result)
105// CHECK: Loaded summary for: char *asctime_r(const struct tm *restrict tm, char *restrict buf)
106// CHECK: Loaded summary for: char *ctime_r(const time_t *timep, char *buf)
107// CHECK: Loaded summary for: struct tm *gmtime_r(const time_t *restrict timer, struct tm *restrict result)
108// CHECK: Loaded summary for: struct tm *gmtime(const time_t *tp)
109// CHECK: Loaded summary for: int clock_gettime(clockid_t clock_id, struct timespec *tp)
110// CHECK: Loaded summary for: int getitimer(int which, struct itimerval *curr_value)
Gabor Martond0128052020-07-23 16:57:16 +0200111// CHECK: Loaded summary for: int pthread_cond_signal(pthread_cond_t *cond)
112// CHECK: Loaded summary for: int pthread_cond_broadcast(pthread_cond_t *cond)
113// CHECK: Loaded summary for: int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg)
114// CHECK: Loaded summary for: int pthread_attr_destroy(pthread_attr_t *attr)
115// CHECK: Loaded summary for: int pthread_attr_init(pthread_attr_t *attr)
116// CHECK: Loaded summary for: int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize)
117// CHECK: Loaded summary for: int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize)
118// CHECK: Loaded summary for: int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
119// CHECK: Loaded summary for: int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize)
120// CHECK: Loaded summary for: int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr)
121// CHECK: Loaded summary for: int pthread_mutex_destroy(pthread_mutex_t *mutex)
122// CHECK: Loaded summary for: int pthread_mutex_lock(pthread_mutex_t *mutex)
123// CHECK: Loaded summary for: int pthread_mutex_trylock(pthread_mutex_t *mutex)
124// CHECK: Loaded summary for: int pthread_mutex_unlock(pthread_mutex_t *mutex)
Gabor Martondb4d5f72020-06-22 11:00:02 +0200125
126long a64l(const char *str64);
127char *l64a(long value);
128int access(const char *pathname, int amode);
129int faccessat(int dirfd, const char *pathname, int mode, int flags);
130int dup(int fildes);
131int dup2(int fildes1, int filedes2);
132int fdatasync(int fildes);
133int fnmatch(const char *pattern, const char *string, int flags);
134int fsync(int fildes);
135typedef unsigned long off_t;
136int truncate(const char *path, off_t length);
137int symlink(const char *oldpath, const char *newpath);
138int symlinkat(const char *oldpath, int newdirfd, const char *newpath);
139int lockf(int fd, int cmd, off_t len);
140typedef unsigned mode_t;
141int creat(const char *pathname, mode_t mode);
142unsigned int sleep(unsigned int seconds);
143typedef struct {
144 int a;
145} DIR;
146int dirfd(DIR *dirp);
147unsigned int alarm(unsigned int seconds);
148int closedir(DIR *dir);
149char *strdup(const char *s);
150typedef typeof(sizeof(int)) size_t;
151char *strndup(const char *s, size_t n);
152/*FIXME How to define wchar_t in the test?*/
153/*typedef __wchar_t wchar_t;*/
154/*wchar_t *wcsdup(const wchar_t *s);*/
155int mkstemp(char *template);
156char *mkdtemp(char *template);
157char *getcwd(char *buf, size_t size);
158int mkdir(const char *pathname, mode_t mode);
159int mkdirat(int dirfd, const char *pathname, mode_t mode);
160typedef int dev_t;
161int mknod(const char *pathname, mode_t mode, dev_t dev);
162int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev);
163int chmod(const char *path, mode_t mode);
164int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
165int fchmod(int fildes, mode_t mode);
166typedef int uid_t;
167typedef int gid_t;
168int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags);
169int chown(const char *path, uid_t owner, gid_t group);
170int lchown(const char *path, uid_t owner, gid_t group);
171int fchown(int fildes, uid_t owner, gid_t group);
172int rmdir(const char *pathname);
173int chdir(const char *path);
174int link(const char *oldpath, const char *newpath);
175int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag);
176int unlink(const char *pathname);
177int unlinkat(int fd, const char *path, int flag);
178struct stat;
179int fstat(int fd, struct stat *statbuf);
180int stat(const char *restrict path, struct stat *restrict buf);
181int lstat(const char *restrict path, struct stat *restrict buf);
182int fstatat(int fd, const char *restrict path, struct stat *restrict buf, int flag);
183DIR *opendir(const char *name);
184DIR *fdopendir(int fd);
185int isatty(int fildes);
186typedef struct {
187 int x;
188} FILE;
189FILE *popen(const char *command, const char *type);
190int pclose(FILE *stream);
191int close(int fildes);
192long fpathconf(int fildes, int name);
193long pathconf(const char *path, int name);
194FILE *fdopen(int fd, const char *mode);
195void rewinddir(DIR *dir);
196void seekdir(DIR *dirp, long loc);
197int rand_r(unsigned int *seedp);
198int strcasecmp(const char *s1, const char *s2);
199int strncasecmp(const char *s1, const char *s2, size_t n);
200int fileno(FILE *stream);
201int fseeko(FILE *stream, off_t offset, int whence);
202off_t ftello(FILE *stream);
203void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
204typedef off_t off64_t;
205void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset);
206int pipe(int fildes[2]);
207off_t lseek(int fildes, off_t offset, int whence);
208typedef size_t ssize_t;
209ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize);
210ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize);
211int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
212char *realpath(const char *restrict file_name, char *restrict resolved_name);
213int execv(const char *path, char *const argv[]);
214int execvp(const char *file, char *const argv[]);
215int getopt(int argc, char *const argv[], const char *optstring);
216
Gabor Marton3ff220d2020-07-07 18:34:20 +0200217// In some libc implementations, sockaddr parameter is a transparent
218// union of the underlying sockaddr_ pointers instead of being a
219// pointer to struct sockaddr.
220// We match that with the joker Irrelevant type.
221struct sockaddr;
222struct sockaddr_at;
223#define __SOCKADDR_ALLTYPES \
224 __SOCKADDR_ONETYPE(sockaddr) \
225 __SOCKADDR_ONETYPE(sockaddr_at)
226#define __SOCKADDR_ONETYPE(type) struct type *__restrict __##type##__;
227typedef union {
228 __SOCKADDR_ALLTYPES
229} __SOCKADDR_ARG __attribute__((__transparent_union__));
230#undef __SOCKADDR_ONETYPE
231#define __SOCKADDR_ONETYPE(type) const struct type *__restrict __##type##__;
232typedef union {
233 __SOCKADDR_ALLTYPES
234} __CONST_SOCKADDR_ARG __attribute__((__transparent_union__));
235#undef __SOCKADDR_ONETYPE
236typedef unsigned socklen_t;
237
238int accept(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len);
239int bind(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len);
240int getpeername(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len);
241int getsockname(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len);
242int connect(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len);
243ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, __SOCKADDR_ARG address, socklen_t *restrict address_len);
244ssize_t sendto(int socket, const void *message, size_t length, int flags, __CONST_SOCKADDR_ARG dest_addr, socklen_t dest_len);
245
246int listen(int sockfd, int backlog);
247ssize_t recv(int sockfd, void *buf, size_t len, int flags);
248struct msghdr;
249ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
250ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
251int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);
252int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len);
253ssize_t send(int sockfd, const void *buf, size_t len, int flags);
254int socketpair(int domain, int type, int protocol, int sv[2]);
255int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags);
Gabor Martonf0b9dbc2020-07-21 18:50:43 +0200256struct utimbuf;
257struct timespec { int x; };
258struct timeval { int x; };
259int utime(const char *filename, struct utimbuf *buf);
260int futimens(int fd, const struct timespec times[2]);
261int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags);
262int utimes(const char *filename, const struct timeval times[2]);
263int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
264typedef unsigned long time_t;
265struct tm *localtime(const time_t *tp);
266struct tm *localtime_r(const time_t *restrict timer, struct tm *restrict result);
267char *asctime_r(const struct tm *restrict tm, char *restrict buf);
268char *ctime_r(const time_t *timep, char *buf);
269struct tm *gmtime_r(const time_t *restrict timer, struct tm *restrict result);
270struct tm *gmtime(const time_t *tp);
271typedef unsigned long clockid_t;
272int clock_gettime(clockid_t clock_id, struct timespec *tp);
273struct itimerval;
274int getitimer(int which, struct itimerval *curr_value);
Gabor Marton3ff220d2020-07-07 18:34:20 +0200275
Gabor Martond0128052020-07-23 16:57:16 +0200276typedef union {
277 int x;
278} pthread_cond_t;
279int pthread_cond_signal(pthread_cond_t *cond);
280int pthread_cond_broadcast(pthread_cond_t *cond);
281typedef union {
282 int x;
283} pthread_attr_t;
284typedef unsigned long int pthread_t;
285int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg);
286int pthread_attr_destroy(pthread_attr_t *attr);
287int pthread_attr_init(pthread_attr_t *attr);
288int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize);
289int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize);
290int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
291int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
292typedef union {
293 int x;
294} pthread_mutex_t;
295typedef union {
296 int x;
297} pthread_mutexattr_t;
298int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
299int pthread_mutex_destroy(pthread_mutex_t *mutex);
300int pthread_mutex_lock(pthread_mutex_t *mutex);
301int pthread_mutex_trylock(pthread_mutex_t *mutex);
302int pthread_mutex_unlock(pthread_mutex_t *mutex);
303
Gabor Martondb4d5f72020-06-22 11:00:02 +0200304// Must have at least one call expression to initialize the summary map.
305int bar(void);
306void foo() {
307 bar();
308}