简体   繁体   中英

C++/Qt Valgrind uninitialized bytes

I am using valgrind to find and close potential memory issues with my application as well as preventing undefined behaviour. My valgrind call looks like this

valgrind --leak-check=full --track-origins=yes -v ./app

The part of code I am not able to fix is this one:

int App::initSignalHandler(bool dfl)
{
for(size_t sigidx =0; sigidx < sigcount; sigidx++ )
    {
        int signal = stopSignals[sigidx];
        const char *signalName = stopSignalNames[sigidx];      // change signal handler
        struct sigaction new_action;
        sigemptyset (&new_action.sa_mask);
        if(dfl)
            new_action.sa_handler = SIG_DFL;
        else
            new_action.sa_handler = App::stopSignalHandler;
        new_action.sa_flags |= SA_RESTART;
        if(sigaction (signal,&new_action,NULL)!=0)
            qWarning() << Q_FUNC_INFO << "error setting signal handler for : " << signalName;
    }
}

Valgrinds output:

==22462== Conditional jump or move depends on uninitialised value(s)
==22462==    at 0x527427C: __libc_sigaction (sigaction.c:53)
==22462==    by 0x117B83: App::initSignalHandler(bool) (app.cpp:127)
==22462==    by 0x116DD7: main (main.cpp:21)
==22462==  Uninitialised value was created by a stack allocation
==22462==    at 0x117B04: App::initSignalHandler(bool) (app.cpp:88)

app.cpp:88 points to the line with the opening bracket of the function initSignalHandler. I looked at every call of this function. I am always passing the boolean and the parameter also has a default false value, so there is no way that this is undefined behaviour.

app.cpp:127 points to

 if(sigaction (signal,&new_action,NULL)!=0)

I pressume that this error stems from the new_actions struct not being fully initialized. Things I have tried to remedy this: memset(&new_action, 0, sizeof(new_action)); but this does not do anything

Somewhere I also found a suggestion struct sigaction new_action = {0}; but that results in a compiler warning -Wmissing-field-initializers which I'd prefer not to have.

So the question is how should I initialize the sigaction struct correctly. I assume that the supposed origin of this error app.cpp:88 will then also be resolved?

Since this is C++, and not C, the proper way to zero-initialize new_object is

struct sigaction new_action{};
//                         ^^ Note the brackets here

Note that the struct keyword is only needed here because of the name conflict between the class sigaction and the function sigaction .


There is one other glaring issue with your function that you should fix: initSignalHandler is declared to return an int , but it doesn't return anything. Falling off the end of a non- void function results in undefined behavior. Your compiler should have warned you about that with something like:

warning: no return statement in function returning non-void [-Wreturn-type]

If it didn't, then you should make sure you have sufficient warnings enabled.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM