C++/Qt Valgrind 未初始化字节

C++/Qt Valgrind uninitialized bytes

我正在使用 valgrind 来查找和关闭我的应用程序的潜在内存问题,以及防止未定义的行为。我的 valgrind 调用如下所示

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

我无法修复的代码部分是:

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 输出:

==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 指向带有函数 initSignalHandler 左括号的行。我查看了这个函数的每次调用。我 总是 传递布尔值并且参数也有一个默认的 false 值,所以这不可能是未定义的行为。

app.cpp:127 点到

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

我认为此错误源于 new_actions 结构未完全初始化。我试图解决这个问题的事情: memset(&new_action, 0, sizeof(new_action)); 但这没有任何作用

我在某处也找到了一个建议 struct sigaction new_action = {0}; 但这会导致编译器警告 -Wmissing-field-initializers 我不希望有。

所以问题是我应该如何正确初始化 sigaction 结构。我假设这个错误 app.cpp:88 的假定来源也将得到解决?

因为这是 C++,而不是 C,所以零初始化 new_object 的正确方法是

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

注意这里只需要struct关键字是因为classsigaction和函数sigaction.

的名称冲突

您的函数还有一个明显的问题需要解决:initSignalHandler 被声明为 return 和 int,但它没有 return 任何东西.从非 void 函数的末尾掉落会导致未定义的行为。你的编译器应该已经用类似的东西警告过你:

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

如果没有,那么您应该确保启用了足够的警告。