C ++ / Qt Valgrind неинициализированные байты - PullRequest
0 голосов
/ 23 января 2020

Я использую 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 будет также решена?

1 Ответ

1 голос
/ 23 января 2020

Поскольку это C ++, а не C, правильный способ инициализации нулями new_object -

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

Обратите внимание, что ключевое слово struct здесь необходимо только из-за конфликта имен между классом sigaction и функцией sigaction.


Существует еще одна явная проблема с вашей функцией, которую вы должны исправить: объявлено, что initSignalHandler возвращает int, но оно ничего не возвращает Падение с конца не void функции приводит к неопределенному поведению. Ваш компилятор должен был предупредить вас об этом примерно так:

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

Если этого не произошло, то убедитесь, что у вас включено достаточное количество предупреждений.

...