• Stefano Garzarella's avatar
    vsock_diag_test: remove free_sock_stat() call in test_no_sockets · ba95a622
    Stefano Garzarella authored
    In `test_no_sockets` we don't expect any sockets, indeed
    check_no_sockets() prints an error and exits if `sockets` list is
    not empty, so free_sock_stat() call is unnecessary since it would
    only be called when the `sockets` list is empty.
    
    This was discovered by a strange warning printed by gcc v11.2.1:
      In file included from ../../include/linux/list.h:7,
                       from vsock_diag_test.c:18:
      vsock_diag_test.c: In function ‘test_no_sockets’:
      ../../include/linux/kernel.h:35:45: error: array subscript ‘struct vsock_stat[0]’ is partly outside array bound
      s of ‘struct list_head[1]’ [-Werror=array-bounds]
         35 |         const typeof(((type *)0)->member) * __mptr = (ptr);     \
            |                                             ^~~~~~
      ../../include/linux/list.h:352:9: note: in expansion of macro ‘container_of’
        352 |         container_of(ptr, type, member)
            |         ^~~~~~~~~~~~
      ../../include/linux/list.h:393:9: note: in expansion of macro ‘list_entry’
        393 |         list_entry((pos)->member.next, typeof(*(pos)), member)
            |         ^~~~~~~~~~
      ../../include/linux/list.h:522:21: note: in expansion of macro ‘list_next_entry’
        522 |                 n = list_next_entry(pos, member);                       \
            |                     ^~~~~~~~~~~~~~~
      vsock_diag_test.c:325:9: note: in expansion of macro ‘list_for_each_entry_safe’
        325 |         list_for_each_entry_safe(st, next, sockets, list) {
            |         ^~~~~~~~~~~~~~~~~~~~~~~~
      In file included from vsock_diag_test.c:18:
      vsock_diag_test.c:333:19: note: while referencing ‘sockets’
        333 |         LIST_HEAD(sockets);
            |                   ^~~~~~~
      ../../include/linux/list.h:23:26: note: in definition of macro ‘LIST_HEAD’
         23 |         struct list_head name = LIST_HEAD_INIT(name)
    
    It seems related to some compiler optimization and assumption
    about the empty `sockets` list, since this warning is printed
    only with -02 or -O3. Also removing `exit(1)` from
    check_no_sockets() makes the warning disappear since in that
    case free_sock_stat() can be reached also when the list is
    not empty.
    Reported-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Signed-off-by: default avatarStefano Garzarella <sgarzare@redhat.com>
    Link: https://lore.kernel.org/r/20211014152045.173872-1-sgarzare@redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    ba95a622
vsock_diag_test.c 11.3 KB