3

valgrind --leak-check=full -v offline

results in:

--6491-- Reading syms from /home/.../offline/offline (0x400000)
--6491-- Reading syms from /lib64/ld-2.11.3.so (0x4000000)
--6491-- Reading syms from /usr/lib64/valgrind/memcheck-amd64-linux (0x38000000)
--6491--    object doesn't have a symbol table
--6491--    object doesn't have a dynamic symbol table
--6491-- Reading suppressions file: /usr/lib64/valgrind/default.supp
--6491-- REDIR: 0x4015fc0 (strlen) redirected to 0x38042017 (???)
--6491-- Reading syms from /usr/lib64/valgrind/vgpreload_core-amd64-linux.so (0x4a20000)
--6491--    object doesn't have a symbol table
--6491-- Reading syms from /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so (0x4c22000)
--6491--    object doesn't have a symbol table
==6491== WARNING: new redirection conflicts with existing -- ignoring it
--6491--     new: 0x04015fc0 (strlen              ) R-> 0x04c26ee0 strlen
--6491-- REDIR: 0x4015f10 (index) redirected to 0x4c26b40 (index)
--6491-- REDIR: 0x4015f90 (strcmp) redirected to 0x4c274e0 (strcmp)
--6491-- Reading syms from /usr/lib64/R/lib/libR.so (0x4e2c000)
--6491-- Reading syms from /usr/lib64/R/lib/libRblas.so (0x543b000)
--6491-- Reading syms from /usr/lib64/R/lib/libRlapack.so (0x5667000)
--6491-- Reading syms from /usr/lib64/R/library/Rcpp/lib/libRcpp.so (0x59e1000)
--6491-- Reading syms from /usr/lib64/R/library/RInside/lib/libRInside.so (0x5c2e000)
--6491-- Reading syms from /home/anisha/qtsdk-2010.05/qt/lib/libQtGui.so.4.7.0 (0x5e43000)
--6491-- Reading syms from /home/anisha/qtsdk-2010.05/qt/lib/libQtCore.so.4.7.0 (0x6bc0000)
--6491-- Reading syms from /lib64/libpthread-2.11.3.so (0x70a3000)
--6491-- Reading syms from /usr/lib64/libstdc++.so.6.0.14 (0x72c0000)
--6491--    object doesn't have a symbol table
--6491-- Reading syms from /lib64/libm-2.11.3.so (0x75c9000)
--6491-- Reading syms from /lib64/libgcc_s.so.1 (0x7820000)
--6491--   Considering /usr/lib/debug/.build-id/e6/eb8011838a065946e5808e036550844548379f.debug ..
--6491--   .. build-id is valid
--6491-- Reading syms from /lib64/libc-2.11.3.so (0x7a36000)
--6491-- Reading syms from /lib64/libreadline.so.6.1 (0x7da3000)
--6491--    object doesn't have a symbol table
--6491-- Reading syms from /lib64/librt-2.11.3.so (0x7fea000)
--6491-- Reading syms from /lib64/libdl-2.11.3.so (0x81f3000)
--6491-- Reading syms from /usr/lib64/libgomp.so.1.0.0 (0x83f7000)



==6491== 5 errors in context 13 of 34:
==6491== Conditional jump or move depends on uninitialised value(s)
==6491==    at 0x611629E: QHash<unsigned int, int>::findNode(unsigned int const&, unsigned int*) const (../include/QtCore/../../src/corelib/tools/qhash.h:884)
==6491==    by 0x62E9AC6: QTextFormatCollection::indexForFormat(QTextFormat const&) (../include/QtCore/../../src/corelib/tools/qhash.h:865)
==6491==    by 0x62E9E51: QTextFormatCollection::createObjectIndex(QTextFormat const&) (/var/tmp/qt-src/src/gui/text/qtextformat.cpp:3142)
==6491==    by 0x62FF56E: QTextDocumentPrivate::createObject(QTextFormat const&, int) (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1588)
==6491==    by 0x62FFD57: QTextDocumentPrivate::rootFrame() const (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1407)
==6491==    by 0x63203B0: QTextDocumentLayout::doLayout(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2908)
==6491==    by 0x632051C: QTextDocumentLayoutPrivate::ensureLayoutedByPosition(int) const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3076)
==6491==    by 0x6320978: QTextDocumentLayoutPrivate::layoutStep() const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3082)
==6491==    by 0x632123C: QTextDocumentLayout::documentChanged(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2874)
==6491==    by 0x62EF7D3: QTextDocument::documentLayout() const (/var/tmp/qt-src/src/gui/text/qtextdocument.cpp:1070)
==6491==    by 0x62C0D36: QTextControlPrivate::_q_documentLayoutChanged() (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:624)
==6491==    by 0x62C104E: QTextControlPrivate::setContent(Qt::TextFormat, QString const&, QTextDocument*) (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:434)


==6491== 3 errors in context 10 of 34:
==6491== Use of uninitialised value of size 8
==6491==    at 0x6116276: QHash<unsigned int, int>::findNode(unsigned int const&, unsigned int*) const (../include/QtCore/../../src/corelib/tools/qhash.h:884)
==6491==    by 0x62E9AC6: QTextFormatCollection::indexForFormat(QTextFormat const&) (../include/QtCore/../../src/corelib/tools/qhash.h:865)
==6491==    by 0x62E9E51: QTextFormatCollection::createObjectIndex(QTextFormat const&) (/var/tmp/qt-src/src/gui/text/qtextformat.cpp:3142)
==6491==    by 0x62FF56E: QTextDocumentPrivate::createObject(QTextFormat const&, int) (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1588)
==6491==    by 0x62FFD57: QTextDocumentPrivate::rootFrame() const (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1407)
==6491==    by 0x63203B0: QTextDocumentLayout::doLayout(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2908)
==6491==    by 0x632051C: QTextDocumentLayoutPrivate::ensureLayoutedByPosition(int) const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3076)
==6491==    by 0x6320978: QTextDocumentLayoutPrivate::layoutStep() const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3082)
==6491==    by 0x632123C: QTextDocumentLayout::documentChanged(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2874)
==6491==    by 0x62EF7D3: QTextDocument::documentLayout() const (/var/tmp/qt-src/src/gui/text/qtextdocument.cpp:1070)
==6491==    by 0x62C0D36: QTextControlPrivate::_q_documentLayoutChanged() (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:624)
==6491==    by 0x62C104E: QTextControlPrivate::setContent(Qt::TextFormat, QString const&, QTextDocument*) (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:434)

==6491== ERROR SUMMARY: 52 errors from 34 contexts (suppressed: 18 from 8)

None of these errors point to my source files.
Do I need to be worried?

The Makefile gets auto generated by qmake.
It DOES contain the -Wall.

CC = gcc
CXX = g++
DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS = -m64 -pipe -O2 -Wall -g -pedantic -W -D_REENTRANT $(DEFINES)

Make does NOT show any warnings to me.

Aquarius_Girl
  • 21,790
  • 65
  • 230
  • 411

2 Answers2

3

The following options helped me in getting some hints (text from man page of Valgrind):

  • --num-callers

Specifies the maximum number of entries shown in stack traces that identify program locations. Note that errors are commoned up using only the top four function locations (the place in the current function, and that of its three immediate callers). So this doesn´t affect the total number of errors reported.

The maximum value for this is 50. Note that higher settings will make Valgrind run a bit more slowly and take a bit more memory, but can be useful when working with programs with deeply-nested call chains.

  • --fullpath-after

By default Valgrind only shows the filenames in stack traces, but not full paths to source files. When using Valgrind in large projects where the sources reside in multiple different directories, this can be inconvenient. --fullpath-after provides a flexible solution to this problem. When this option is present, the path to each source file is shown,

  • --track-origins=yes

Controls whether Memcheck tracks the origin of uninitialised values. By default, it does not, which means that although it can tell you that an uninitialised value is being used in a dangerous way, it cannot tell you where the uninitialised value came from. This often makes it difficult to track down the root problem.

Aquarius_Girl
  • 21,790
  • 65
  • 230
  • 411
2

Do I need to be worried?

Yes. You may be using Qt's functions wrong, by passing them arguments that do not respect the contract described for them in the documentation.

Suppose you used the standard library memcpy() like this:

char t[10];
memcpy(t, ..., 12);

Valgrind would flag a buffer overflow in memcpy(), but memcpy() would not be responsible in this case: instead, the caller of memcpy() is using it wrong.

Here, you may be passing pointers to uninitialized memory to Qt functions that expect to be able to read from them. If the Qt functions are documented as reading from the pointed memory, it means your program is at fault.

EDIT:

Similarly, the direct caller of the function at fault may not be the real culprit: it may itself have been tripped by receiving a wrong argument. In practice, the programming error is somewhere along the call stack that is current when Valgrind detects an issue. In “design by contract”, the programming methodology that encourages to think about functions requirements and guarantees, this is called “assigning blame”.

Pascal Cuoq
  • 79,187
  • 7
  • 161
  • 281
  • thanks. But how to know in the giant code which functions are wrong? I don't get any major warnings through the `-Wall` option. – Aquarius_Girl Dec 05 '12 at 08:47
  • Here are some ideas: - Inspect the places where you directly call the functions flagged by Valgrind - See if it is possible to obtain from Valgrind a call-stack at the point an error happens; this would help identifying where a contract is broken. I'm sorry I am no expert of Valgrind myself (the issue of “assigning blame” here is only similar to one I encounter frequently with another tool: http://blog.frama-c.com/index.php?post/2011/04/05/QuickLZ-1 ) – Pascal Cuoq Dec 05 '12 at 08:53
  • *"Inspect the places where you directly call the functions flagged by Valgrind "* The problem is that the function pointed out by Valgrind are NO where in my code. I haven't used functions like - `creatObject`, `setContent` etc. anywhere. They look like internal Qt functions. – Aquarius_Girl Dec 05 '12 at 08:58
  • @AnishaKaul In this case you absolutely need a callstack. I found this, but it is not answered as of now: http://stackoverflow.com/questions/11242795/how-to-get-the-full-call-stack-from-valgrind It looks like the option `--num-callers=` is supposed to provide callstacks, though. – Pascal Cuoq Dec 05 '12 at 09:02
  • thanks, I'll look into that and follow up. I suggest that you add the callstack thing in your answer to make it look complete. – Aquarius_Girl Dec 05 '12 at 09:09