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]
如果没有,那么您应该确保启用了足够的警告。
我正在使用 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]
如果没有,那么您应该确保启用了足够的警告。