251 lines · c
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 -verify9 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 %s18 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 156void clang_analyzer_eval(int);157 158void test_open(void) {159 open(0, 0); // \160 // expected-warning{{The 1st argument to 'open' is NULL but should not be NULL}}161}162 163void 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 168void 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 180void 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 191void 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 201void 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 211void 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 216void 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 221void 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 else228 clang_analyzer_eval(Bufsize == 0); // expected-warning{{UNKNOWN}}229}230 231void 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 else238 clang_analyzer_eval(Bufsize == 0); // expected-warning{{UNKNOWN}}239}240 241void test_setsockopt_bufptr_null(int x) {242 char buf[10] = {0};243 244 setsockopt(1, 2, 3, 0, 0);245 setsockopt(1, 2, 3, buf, 10);246 if (x)247 setsockopt(1, 2, 3, buf, 11); // expected-warning{{The 4th argument to 'setsockopt' is a buffer with size 10 but should be a buffer with size equal to or greater than the value of the 5th argument (which is 11)}}248 else249 setsockopt(1, 2, 3, 0, 10); // expected-warning{{The 4th argument to 'setsockopt' is NULL but should not be NULL}}250}251