1 /* { dg-require-effective-target sockets } */
2 /* { dg-skip-if "" { powerpc*-*-aix* } } */
5 #include <sys/socket.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);
27 void test_close_checked_socket (void)
29 int fd
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
32 __analyzer_dump_state ("file-descriptor", fd
); /* { dg-warning "state: 'fd-new-datagram-socket'" } */
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'" } */
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);
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
));
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'" } */
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" } */
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" } */
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 } */
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" } */
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" } */
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 } */