Search code examples
cgccstructgcc-warning

gcc struct assignment warning missing braces around initializer


struct rtentry

The following

#include <net/route.h>
#include <netinet/in.h>
int main(){
  struct rtentry e={};
  *((struct sockaddr_in*)(&(e.rt_genmask)))=(struct sockaddr_in){.sin_family=AF_INET,.sin_port=0,.sin_addr=INADDR_ANY};
  return 0;
}

gives the warning (gcc -std=c11 -Wall test.c)

test.c:5:45: warning: missing braces around initializer [-Wmissing-braces]
    5 |   *((struct sockaddr_in*)(&(e.rt_genmask)))=(struct sockaddr_in){.sin_family=AF_INET,.sin_port=0,.sin_addr=INADDR_ANY};
      |                                             ^
                                         ^

Why? How may I fix the code?


Solution

    1. INADDR_ANY is macro defined.
    2. in_addr is a struct for wrapping value. You need to use .sin_addr={INADDR_ANY} to make sure it's initialized by value INADDR_ANY.
               struct sockaddr_in {
                   sa_family_t    sin_family; /* address family: AF_INET */
                   in_port_t      sin_port;   /* port in network byte order */
                   struct in_addr sin_addr;   /* internet address */
               };
    
               /* Internet address. */
               struct in_addr {
                   uint32_t       s_addr;     /* address in network byte order */
               };
    

    Fixed: https://godbolt.org/z/xM8r1E

    #include <net/route.h>
    
    int main(void) {
        struct rtentry e={};
        *(struct sockaddr_in*)(&(e.rt_dst))=(struct sockaddr_in){
        .sin_family=AF_INET,
        .sin_port=0,
        .sin_addr={INADDR_ANY}
        };
        return 0;
    }