(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
fd-stream-socket-passive-open.c
       1  /* Verify the various states when performing a passive open,
       2     either from scratch, or when various phases are assumed to already
       3     be done.  */
       4  
       5  /* { dg-require-effective-target sockets } */
       6  /* { dg-skip-if "" { powerpc*-*-aix* } } */
       7  
       8  #include <sys/socket.h>
       9  #include <sys/un.h>
      10  #include <unistd.h>
      11  #include <errno.h>
      12  #include "analyzer-decls.h"
      13  
      14  void test_passive_open_from_scratch (const char *sockname, void *buf)
      15  {
      16    struct sockaddr_un addr;
      17    int afd;
      18    errno = 0;
      19    int fd = socket (AF_UNIX, SOCK_STREAM, 0);
      20    if (fd == -1)
      21      {
      22        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-invalid'" } */
      23        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      24        return;
      25      }
      26    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-stream-socket'" } */
      27    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      28    memset (&addr, 0, sizeof (addr));
      29    addr.sun_family = AF_UNIX;
      30    strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
      31    errno = 0;
      32    if (bind (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1)
      33      {
      34        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-stream-socket'" } */
      35        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      36        close (fd);
      37        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      38        return;
      39      }
      40    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-stream-socket'" } */
      41    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      42    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
      43    if (listen (fd, 5) == -1)
      44      {
      45        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-stream-socket'" } */
      46        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      47        close (fd);
      48        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      49        return;
      50      }
      51    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
      52    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      53    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
      54    afd = accept (fd, NULL, NULL);
      55    if (afd == -1)
      56      {
      57        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
      58        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      59        close (fd);
      60        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      61        return;
      62      }
      63    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
      64    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
      65    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      66    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
      67    __analyzer_eval (afd >= 0); /* { dg-warning "TRUE" } */
      68  
      69    write (afd, "hello", 6);
      70    read (afd, buf, 100);
      71    
      72    close (afd);
      73    close (fd);
      74    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-closed'" } */
      75    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      76  }
      77  
      78  void test_passive_open_from_bind (int fd, const char *sockname, void *buf)
      79  {
      80    struct sockaddr_un addr;
      81    int afd;
      82    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'start'" } */
      83    memset (&addr, 0, sizeof (addr));
      84    addr.sun_family = AF_UNIX;
      85    strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
      86    errno = 0;
      87    if (bind (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1)
      88      {
      89        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-new-unknown-socket'" } */
      90        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
      91        close (fd);
      92        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
      93        return;
      94      }
      95    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-unknown-socket'" } */
      96    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
      97    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
      98    if (listen (fd, 5) == -1)
      99      {
     100        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-unknown-socket'" } */
     101        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     102        close (fd);
     103        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     104        return;
     105      }
     106    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     107    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     108    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     109    afd = accept (fd, NULL, NULL);
     110    if (afd == -1)
     111      {
     112        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     113        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     114        close (fd);
     115        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     116        return;
     117      }
     118    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     119    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
     120    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     121    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     122    __analyzer_eval (afd >= 0); /* { dg-warning "TRUE" } */
     123  
     124    write (afd, "hello", 6);  
     125    read (afd, buf, 100);
     126  
     127    close (afd);
     128    close (fd);
     129    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-closed'" } */
     130    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     131  }
     132  
     133  void test_passive_open_from_bind_constant (const char *sockname, void *buf)
     134  {
     135    const int fd = 42;
     136    struct sockaddr_un addr;
     137    int afd;
     138    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-constant'" } */
     139    memset (&addr, 0, sizeof (addr));
     140    addr.sun_family = AF_UNIX;
     141    strncpy (addr.sun_path, sockname, sizeof(addr.sun_path) - 1);
     142    errno = 0;
     143    if (bind (fd, (struct sockaddr *)&addr, sizeof (addr)) == -1)
     144      {
     145        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-constant'" } */
     146        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     147        close (fd);
     148        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     149        return;
     150      }
     151    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-unknown-socket'" } */
     152    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     153    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     154    if (listen (fd, 5) == -1)
     155      {
     156        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-unknown-socket'" } */
     157        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     158        close (fd);
     159        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     160        return;
     161      }
     162    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     163    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     164    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     165    afd = accept (fd, NULL, NULL);
     166    if (afd == -1)
     167      {
     168        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     169        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     170        close (fd);
     171        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     172        return;
     173      }
     174    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     175    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
     176    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     177    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     178    __analyzer_eval (afd >= 0); /* { dg-warning "TRUE" } */
     179  
     180    write (afd, "hello", 6);  
     181    read (afd, buf, 100);
     182  
     183    close (afd);
     184    close (fd);
     185    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-closed'" } */
     186    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     187  }
     188  
     189  void test_passive_open_from_listen (int fd, void *buf)
     190  {
     191    int afd;
     192    errno = 0;
     193    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'start'" } */
     194    if (listen (fd, 5) == -1)
     195      {
     196        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-bound-stream-socket'" } */
     197        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     198        close (fd);
     199        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     200        return;
     201      }
     202    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     203    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     204    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     205    afd = accept (fd, NULL, NULL);
     206    if (afd == -1)
     207      {
     208        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     209        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     210        close (fd);
     211        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     212        return;
     213      }
     214    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     215    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
     216    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     217    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     218    __analyzer_eval (afd >= 0); /* { dg-warning "TRUE" } */
     219  
     220    write (afd, "hello", 6);
     221    read (afd, buf, 100);
     222  
     223    close (afd);
     224    close (fd);
     225    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-closed'" } */
     226    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     227  }
     228  
     229  
     230  void test_passive_open_from_listen_constant (void *buf)
     231  {
     232    const int fd = 42;
     233    int afd;
     234    errno = 0;
     235    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-constant'" } */
     236    if (listen (fd, 5) == -1)
     237      {
     238        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-constant'" } */
     239        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     240        close (fd);
     241        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     242        return;
     243      }
     244    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     245    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     246    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     247    afd = accept (fd, NULL, NULL);
     248    if (afd == -1)
     249      {
     250        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     251        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     252        close (fd);
     253        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     254        return;
     255      }
     256    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     257    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
     258    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     259    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     260    __analyzer_eval (afd >= 0); /* { dg-warning "TRUE" } */
     261  
     262    write (afd, "hello", 6);
     263    read (afd, buf, 100);
     264  
     265    close (afd);
     266    close (fd);
     267    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-closed'" } */
     268    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     269  }
     270  
     271  void test_passive_open_from_accept (int fd, void *buf)
     272  {
     273    int afd;
     274    errno = 0;
     275    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'start'" } */
     276    afd = accept (fd, NULL, NULL);
     277    if (afd == -1)
     278      {
     279        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     280        __analyzer_eval (errno > 0); /* { dg-warning "TRUE" } */
     281        close (fd);
     282        __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     283        return;
     284      }
     285    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-listening-stream-socket'" } */
     286    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-connected-stream-socket'" } */
     287    __analyzer_eval (errno == 0); /* { dg-warning "TRUE" } */
     288    __analyzer_eval (fd >= 0); /* { dg-warning "TRUE" } */
     289    __analyzer_eval (afd >= 0); /* { dg-warning "TRUE" } */
     290  
     291    write (afd, "hello", 6);
     292    read (afd, buf, 100);
     293  
     294    close (afd);
     295    close (fd);
     296    __analyzer_dump_state ("file-descriptor", afd); /* { dg-warning "state: 'fd-closed'" } */
     297    __analyzer_dump_state ("file-descriptor", fd); /* { dg-warning "state: 'fd-closed'" } */
     298  }