Search code examples
c++clang-tidy

The proper way to initialize array of char with constant string


I use a struct to transfer data over TCP-IP and I have to stick with certain packet size, so I use char array of fixed size for text data. Due to the fact that I can't initialize it otherwise, I forced to copy string to that array in constructor using simple function (based on strcpy). The problem is: analyzer (clang-tidy Ubuntu LLVM 14.0.0) tells me

warning: constructor does not initialize these fields: receiver [cppcoreguidelines-pro-type-member-init]

but in fact that is not true. Tell me, please, how do I change my code to suppress those warnings messages? I understand, that I can initialize those arrays with zeros using {} and than fill them with the needed data, but it looks like double work..

inline void copyName(char *dst, const char *src) {
    strncpy(dst, src, MAX_NAME_LENGTH);
}

struct Header {
    const MessageType type;
    char receiver[MAX_NAME_LENGTH];
    static uint32_t messageId;
    Header();
    Header(MessageType type, const char* receiver);
};

Header::Header(const MessageType type, const char *receiverName)
    : type(type) // the warning is here
{
    copyName(receiver, receiverName);
    Header::messageId++;
}

P.S> Found some workaround (which, of course, not the answer to the actual question): there is the option IgnoreArrays for that warning which, when set to true, suppresses those warnings


Solution

  • The warning is a false positive. The clang-tidy docs for the warning you got say:

    The check takes assignment of fields in the constructor body into account but generates false positives for fields initialized in methods invoked in the constructor body.

    https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.html

    Seems like a poor check to me, but if you want to keep it enabled you might be able to suppress this one instance of it using the magic // NOLINT comment...somewhere?