Testsuite: fix analyzer tests on Darwin
[official-gcc.git] / gcc / testsuite / gcc.dg / analyzer / fd-datagram-socket.c
blob59e80c831e3e28e79f04ceb0ae6c56a6dff4775d
1 /* { dg-require-effective-target sockets } */
2 /* { dg-skip-if "" { powerpc*-*-aix* } } */
4 #include <string.h>
5 #include <sys/socket.h>
6 #include <sys/un.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include "analyzer-decls.h"
11 void test_leak_socket (void)
13 int fd = socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-message "datagram socket created here" } */
14 } /* { dg-warning "leak of file descriptor 'fd'" } */
16 void test_leak_socket_no_lhs (void)
18 socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-warning "leak of file descriptor" } */
21 void test_close_unchecked_socket (void)
23 int fd = socket (AF_UNIX, SOCK_DGRAM, 0);
24 close (fd);
27 void test_close_checked_socket (void)
29 int fd = socket (AF_UNIX, SOCK_DGRAM, 0);
30 if (fd == -1)
31 return;
32 __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-datagram-socket'" } */
33 close (fd);
36 void test_leak_checked_socket (void)
38 int fd = socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-message "datagram socket created here" } */
39 if (fd == -1) /* { dg-warning "leak of file descriptor 'fd'" } */
40 return;
41 // TODO: strange location for leak message
44 void test_bind (const char *sockname)
46 struct sockaddr_un addr;
47 int fd = socket (AF_UNIX, SOCK_DGRAM, 0);
48 if (fd == -1)
49 return;
50 __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-datagram-socket'" } */
51 memset (&addr, 0, sizeof (addr));
52 addr.sun_family = AF_UNIX;
53 strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
54 bind (fd, (struct sockaddr *)&addr, sizeof (addr));
55 close (fd);
58 void test_bind_on_unchecked_socket (const char *sockname)
60 struct sockaddr_un addr;
61 int fd = socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-message "when 'socket' fails" } */
62 memset (&addr, 0, sizeof (addr));
63 addr.sun_family = AF_UNIX;
64 strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
65 bind (fd, (struct sockaddr *)&addr, sizeof (addr)); /* { dg-warning "'bind' on possibly invalid file descriptor 'fd'" } */
66 close (fd);
69 void test_leak_of_bound_socket (const char *sockname)
71 struct sockaddr_un addr;
72 int fd = socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-message "datagram socket created here" } */
73 if (fd == -1)
74 return;
75 memset (&addr, 0, sizeof (addr));
76 addr.sun_family = AF_UNIX;
77 strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
78 bind (fd, (struct sockaddr *)&addr, sizeof (addr)); /* { dg-warning "leak of file descriptor 'fd'" } */
81 void test_listen_on_datagram_socket_without_bind (void)
83 int fd = socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-message "datagram socket created here" } */
84 if (fd == -1)
85 return;
86 __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-datagram-socket'" } */
87 listen (fd, 5); /* { dg-warning "'listen' on datagram socket file descriptor 'fd' \\\[-Wanalyzer-fd-type-mismatch\\\]" "warning" } */
88 /* { dg-message "'listen' expects a stream socket file descriptor but 'fd' is a datagram socket" "final event" { target *-*-* } .-1 } */
89 close (fd);
92 void test_listen_on_datagram_socket_with_bind (const char *sockname)
94 int fd = socket (AF_UNIX, SOCK_DGRAM, 0); /* { dg-message "datagram socket created here" } */
95 if (fd == -1)
96 return;
98 __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-datagram-socket'" } */
100 struct sockaddr_un addr;
101 memset (&addr, 0, sizeof (addr));
102 addr.sun_family = AF_UNIX;
103 strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
104 if (bind (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1) /* { dg message "datagram socket bound here" } */
106 close (fd);
107 return;
109 listen (fd, 5); /* { dg-warning "'listen' on datagram socket file descriptor 'fd' \\\[-Wanalyzer-fd-type-mismatch\\\]" "warning" } */
110 /* { dg-message "'listen' expects a stream socket file descriptor but 'fd' is a datagram socket" "final event" { target *-*-* } .-1 } */
111 close (fd);