Gabor Marton | db4d5f7 | 2020-06-22 11:00:02 +0200 | [diff] [blame] | 1 | // 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 Marton | 3ff220d | 2020-07-07 18:34:20 +0200 | [diff] [blame^] | 82 | // 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 Marton | db4d5f7 | 2020-06-22 11:00:02 +0200 | [diff] [blame] | 98 | |
| 99 | long a64l(const char *str64); |
| 100 | char *l64a(long value); |
| 101 | int access(const char *pathname, int amode); |
| 102 | int faccessat(int dirfd, const char *pathname, int mode, int flags); |
| 103 | int dup(int fildes); |
| 104 | int dup2(int fildes1, int filedes2); |
| 105 | int fdatasync(int fildes); |
| 106 | int fnmatch(const char *pattern, const char *string, int flags); |
| 107 | int fsync(int fildes); |
| 108 | typedef unsigned long off_t; |
| 109 | int truncate(const char *path, off_t length); |
| 110 | int symlink(const char *oldpath, const char *newpath); |
| 111 | int symlinkat(const char *oldpath, int newdirfd, const char *newpath); |
| 112 | int lockf(int fd, int cmd, off_t len); |
| 113 | typedef unsigned mode_t; |
| 114 | int creat(const char *pathname, mode_t mode); |
| 115 | unsigned int sleep(unsigned int seconds); |
| 116 | typedef struct { |
| 117 | int a; |
| 118 | } DIR; |
| 119 | int dirfd(DIR *dirp); |
| 120 | unsigned int alarm(unsigned int seconds); |
| 121 | int closedir(DIR *dir); |
| 122 | char *strdup(const char *s); |
| 123 | typedef typeof(sizeof(int)) size_t; |
| 124 | char *strndup(const char *s, size_t n); |
| 125 | /*FIXME How to define wchar_t in the test?*/ |
| 126 | /*typedef __wchar_t wchar_t;*/ |
| 127 | /*wchar_t *wcsdup(const wchar_t *s);*/ |
| 128 | int mkstemp(char *template); |
| 129 | char *mkdtemp(char *template); |
| 130 | char *getcwd(char *buf, size_t size); |
| 131 | int mkdir(const char *pathname, mode_t mode); |
| 132 | int mkdirat(int dirfd, const char *pathname, mode_t mode); |
| 133 | typedef int dev_t; |
| 134 | int mknod(const char *pathname, mode_t mode, dev_t dev); |
| 135 | int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev); |
| 136 | int chmod(const char *path, mode_t mode); |
| 137 | int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags); |
| 138 | int fchmod(int fildes, mode_t mode); |
| 139 | typedef int uid_t; |
| 140 | typedef int gid_t; |
| 141 | int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags); |
| 142 | int chown(const char *path, uid_t owner, gid_t group); |
| 143 | int lchown(const char *path, uid_t owner, gid_t group); |
| 144 | int fchown(int fildes, uid_t owner, gid_t group); |
| 145 | int rmdir(const char *pathname); |
| 146 | int chdir(const char *path); |
| 147 | int link(const char *oldpath, const char *newpath); |
| 148 | int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag); |
| 149 | int unlink(const char *pathname); |
| 150 | int unlinkat(int fd, const char *path, int flag); |
| 151 | struct stat; |
| 152 | int fstat(int fd, struct stat *statbuf); |
| 153 | int stat(const char *restrict path, struct stat *restrict buf); |
| 154 | int lstat(const char *restrict path, struct stat *restrict buf); |
| 155 | int fstatat(int fd, const char *restrict path, struct stat *restrict buf, int flag); |
| 156 | DIR *opendir(const char *name); |
| 157 | DIR *fdopendir(int fd); |
| 158 | int isatty(int fildes); |
| 159 | typedef struct { |
| 160 | int x; |
| 161 | } FILE; |
| 162 | FILE *popen(const char *command, const char *type); |
| 163 | int pclose(FILE *stream); |
| 164 | int close(int fildes); |
| 165 | long fpathconf(int fildes, int name); |
| 166 | long pathconf(const char *path, int name); |
| 167 | FILE *fdopen(int fd, const char *mode); |
| 168 | void rewinddir(DIR *dir); |
| 169 | void seekdir(DIR *dirp, long loc); |
| 170 | int rand_r(unsigned int *seedp); |
| 171 | int strcasecmp(const char *s1, const char *s2); |
| 172 | int strncasecmp(const char *s1, const char *s2, size_t n); |
| 173 | int fileno(FILE *stream); |
| 174 | int fseeko(FILE *stream, off_t offset, int whence); |
| 175 | off_t ftello(FILE *stream); |
| 176 | void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); |
| 177 | typedef off_t off64_t; |
| 178 | void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset); |
| 179 | int pipe(int fildes[2]); |
| 180 | off_t lseek(int fildes, off_t offset, int whence); |
| 181 | typedef size_t ssize_t; |
| 182 | ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize); |
| 183 | ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize); |
| 184 | int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath); |
| 185 | char *realpath(const char *restrict file_name, char *restrict resolved_name); |
| 186 | int execv(const char *path, char *const argv[]); |
| 187 | int execvp(const char *file, char *const argv[]); |
| 188 | int getopt(int argc, char *const argv[], const char *optstring); |
| 189 | |
Gabor Marton | 3ff220d | 2020-07-07 18:34:20 +0200 | [diff] [blame^] | 190 | // In some libc implementations, sockaddr parameter is a transparent |
| 191 | // union of the underlying sockaddr_ pointers instead of being a |
| 192 | // pointer to struct sockaddr. |
| 193 | // We match that with the joker Irrelevant type. |
| 194 | struct sockaddr; |
| 195 | struct sockaddr_at; |
| 196 | #define __SOCKADDR_ALLTYPES \ |
| 197 | __SOCKADDR_ONETYPE(sockaddr) \ |
| 198 | __SOCKADDR_ONETYPE(sockaddr_at) |
| 199 | #define __SOCKADDR_ONETYPE(type) struct type *__restrict __##type##__; |
| 200 | typedef union { |
| 201 | __SOCKADDR_ALLTYPES |
| 202 | } __SOCKADDR_ARG __attribute__((__transparent_union__)); |
| 203 | #undef __SOCKADDR_ONETYPE |
| 204 | #define __SOCKADDR_ONETYPE(type) const struct type *__restrict __##type##__; |
| 205 | typedef union { |
| 206 | __SOCKADDR_ALLTYPES |
| 207 | } __CONST_SOCKADDR_ARG __attribute__((__transparent_union__)); |
| 208 | #undef __SOCKADDR_ONETYPE |
| 209 | typedef unsigned socklen_t; |
| 210 | |
| 211 | int accept(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len); |
| 212 | int bind(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len); |
| 213 | int getpeername(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len); |
| 214 | int getsockname(int socket, __SOCKADDR_ARG address, socklen_t *restrict address_len); |
| 215 | int connect(int socket, __CONST_SOCKADDR_ARG address, socklen_t address_len); |
| 216 | ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, __SOCKADDR_ARG address, socklen_t *restrict address_len); |
| 217 | ssize_t sendto(int socket, const void *message, size_t length, int flags, __CONST_SOCKADDR_ARG dest_addr, socklen_t dest_len); |
| 218 | |
| 219 | int listen(int sockfd, int backlog); |
| 220 | ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
| 221 | struct msghdr; |
| 222 | ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); |
| 223 | ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); |
| 224 | int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len); |
| 225 | int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len); |
| 226 | ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
| 227 | int socketpair(int domain, int type, int protocol, int sv[2]); |
| 228 | int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags); |
| 229 | |
Gabor Marton | db4d5f7 | 2020-06-22 11:00:02 +0200 | [diff] [blame] | 230 | // Must have at least one call expression to initialize the summary map. |
| 231 | int bar(void); |
| 232 | void foo() { |
| 233 | bar(); |
| 234 | } |