int open(const char *, int mode); void close(int fd); int dup (int old_fd); int dup2 (int old_fd, int new_fd); int dup3 (int old_fd, int new_fd, int flags); int write (int fd, void *buf, int nbytes); int read (int fd, void *buf, int nbytes); #define O_RDONLY 0 #define O_WRONLY 1 #define O_RDWR 2 #define O_ACCMODE 3 void test_1 (const char *path) { int old_fd = open (path, O_RDWR); int new_fd = dup (old_fd); /* { dg-warning "'dup' on possibly invalid file descriptor 'old_fd'" } */ close(old_fd); close(new_fd); } void test_2 (const char *path) { int old_fd = open (path, O_RDWR); if (old_fd != -1) { int new_fd = dup (old_fd); close(old_fd); return; /* { dg-warning "leak of file descriptor 'new_fd' \\\[CWE-775\\\]" } */ } } void test_3 (const char *path, void *buf) { int old_fd = open (path, O_RDWR); if (old_fd != -1) { int new_fd = dup (old_fd); write (new_fd, buf, 1); /* { dg-warning "'write' on possibly invalid file descriptor 'new_fd'" } */ close (new_fd); close(old_fd); } } void test_5 (const char *path, void *buf) { int old_fd = open (path, O_RDWR); if (old_fd != -1) { int new_fd = dup (old_fd); if (new_fd != -1) { write (new_fd, buf, 1); close (new_fd); } close(old_fd); } } void test_7 (const char *path) { int old_fd = open (path, O_RDWR); dup2 (old_fd, 4); /* { dg-warning "'dup2' on possibly invalid file descriptor 'old_fd'" } */ close(old_fd); } void test_8 (const char *path) { int old_fd = open (path, O_RDWR); int new_fd = open (path, O_RDWR); if (old_fd != -1) { dup2 (old_fd, new_fd); /* { dg-warning "'dup2' on possibly invalid file descriptor 'new_fd'" } */ close (old_fd); } close (new_fd); } void test_9 (const char *path, void *buf) { int old_fd = open (path, O_RDWR); if (old_fd != -1) { int new_fd = open (path, O_RDWR); if (new_fd != -1) { int lhs = dup2 (old_fd, new_fd); write (lhs, buf, 1); /* { dg-warning "'write' on possibly invalid file descriptor 'lhs'" } */ close(new_fd); close(lhs); } close(old_fd); } } void test_10 (const char *path, int flags) { int old_fd = open (path, O_RDWR); int new_fd = open (path, O_RDWR); if (old_fd != -1) { dup3 (old_fd, new_fd, flags); /* { dg-warning "'dup3' on possibly invalid file descriptor 'new_fd'" } */ close(old_fd); } close(new_fd); } void test_11 (const char *path, int flags) { int old_fd = open (path, O_RDWR); int new_fd = open (path, O_RDWR); if (new_fd != -1) { dup3 (old_fd, new_fd, flags); /* { dg-warning "'dup3' on possibly invalid file descriptor 'old_fd'" } */ close(new_fd); } close(old_fd); } void test_12 (const char *path, void *buf) { int old_fd = open (path, O_RDONLY); if (old_fd != -1) { int new_fd = dup (old_fd); if (new_fd != -1) { write (new_fd, buf, 1); /* { dg-warning "'write' on read-only file descriptor 'new_fd'" } */ close(new_fd); } close(old_fd); } } void test_13 (const char *path, void *buf) { int old_fd = open (path, O_WRONLY); if (old_fd != -1) { int new_fd = dup (old_fd); if (new_fd != -1) { read (new_fd, buf, 1); /* { dg-warning "'read' on write-only file descriptor 'new_fd'" } */ close(new_fd); } close(old_fd); } } void test_14 (const char *path, void *buf) { int old_fd = open (path, O_RDWR); if (old_fd != -1) { int new_fd = dup (old_fd); if (new_fd != -1) { write (new_fd, buf, 1); read (new_fd, buf, 1); close(new_fd); } close(old_fd); } } void test_15 (void *buf) { int fd = dup(0); read (fd, buf, 1); /* { dg-warning "'read' on possibly invalid file descriptor 'fd'" } */ close(fd); } void test_16 (void *buf) { int fd = dup(1); if (fd != -1) { write (fd, buf, 1); close (fd); } } void test_17 (const char *path) { int fd = open (path, O_RDWR); close(fd); dup (fd); /* { dg-warning "'dup' on closed file descriptor 'fd'" } */ dup2 (fd, 4); /* { dg-warning "'dup2' on closed file descriptor 'fd'" } */ } void test_18 (const char *path, void *buf) { int fd = open (path, O_RDWR); if (fd != -1) { int fd2 = dup2 (fd, 3); read (fd2, buf, 1); /* { dg-warning "'read' on possibly invalid file descriptor 'fd2'" } */ close(fd); close(fd2); } } void test_19 (const char *path, void *buf) { int fd = open (path, O_WRONLY); if (fd != -1) { int fd2 = dup2 (fd, 4); if (fd2 != -1) { read (fd2, buf, 1); /* { dg-warning "'read' on write-only file descriptor 'fd2'" } */ close(fd2); } close (fd); } } extern int m; void test_20 () { int fd = dup (m); close (fd); } void test_21 () { int fd = dup2 (m, 1); close (fd); } void test_22 (int flags) { int fd = dup3 (m, 1, flags); close (fd); } void do_something(); void test_23 () { int nullfd = -1; int fd = 1; if (dup2 (nullfd, fd) < 0) /* { dg-warning "'dup2' on possibly invalid file descriptor 'nullfd'" } */ { do_something(); } }