Search code examples
c++clang-tidy

Clang-Tidy: Uninitialized record type


While trying to create a socket connection to my port I encounter the following warning from CLion

Clang-Tidy: Uninitialized record type: 'server_address'

Here is my code:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main() {
    const int server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        std::cerr << "Socket creation error" << std::endl;
        return EXIT_FAILURE;
    }

    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(8080);
    server_address.sin_addr.s_addr = INADDR_ANY;

    if (bind(server_socket, reinterpret_cast<struct sockaddr *>(&server_address), sizeof(server_address)) < 0) {
        std::cerr << "Socket to port binding error" << std::endl;
        return EXIT_FAILURE;
    }

    std::cout << "server is running and bound to port 8080" << std::endl;
    close(server_socket);
    return EXIT_SUCCESS;
}

I don't really know what to do about it since I am not familiar with CLang-Tidy


Solution

  • It complains about the line

    struct sockaddr_in server_address;
    
    1. C++ does not require struct
      sockaddr_in server_address;
      
    2. The structure is primary defined for C
      struct sockaddr_in {
        sa_family_t     sin_family;     /* AF_INET */
        in_port_t       sin_port;       /* Port number */
        struct in_addr  sin_addr;       /* IPv4 address */
      };
      
    3. Thus, the members get indeterminate values at sockaddr_in server_address;. To ensure the members are default initialized use the empty initialization list:
      sockaddr_in server_address{};
      server_address.sin_family = AF_INET;
      server_address.sin_port = htons(8080);
      server_address.sin_addr.s_addr = INADDR_ANY;
      
      or a bit beter
      sockaddr_in server_address{
        .sin_family = AF_INET,
        .sin_port = htons(8080), 
        .sin_addr = {INADDR_ANY}
      };
      

    You can read more about this diagnostic warning here. I think it refers to the C++ Core Guidelines rule ES.20: Always initialize an object.