Я использую 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)
приложение. cpp: 88 указывает на строку с открывающей скобкой функции initSignalHandler. Я посмотрел на каждый вызов этой функции. Я всегда передаю логическое значение, и у параметра также есть ложное значение по умолчанию, поэтому нет способа, которым это неопределенное поведение.
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. Я предполагаю, что предполагаемое происхождение этой ошибки приложение. cpp: 88 будет также решена?