[Interest] Qt is good because...

Thiago Macieira thiago.macieira at intel.com
Tue Mar 27 17:59:51 CEST 2012


On terça-feira, 27 de março de 2012 15.44.06, Rui Maciel wrote:
> On 03/27/2012 02:51 PM, Quim Gil wrote:
> > I will include tohttp://qt-project.org/wiki/Qt-is-Good  what is not
> > already there.
> 
> I've noticed that the article includes the following sentence:
> 
> <quote>
> All the source code of the Qt libraries is open source and well written
> with good API references.
> </quote>
> 
> 
> I would take some precautions in claiming that it is "well written".
> Not that it is poorly written.  It isn't.  Yet, when a Qt app is ran
> under a code profiler such as valgrind, a lengthy set of warnings is
> displayed regarding a series of invalid memory accesses and conditional
> jumps or moves depending on uninitialised values.
> 
> Granted, maybe this problem is distro-specific, and not related to Qt
> per se.  Is anyone else willing to test this?

I constantly run Qt apps under valgrind. The results are usually either false 
positives or not Qt's fault. Not always -- I've just caught one failure in Qt 
4.8 that I can't attribute to any outside source -- but often enough.

For example,
$ valgrind designer
 Invalid read of size 4
    at 0x32C9408083: ??? (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C940A447: FcConfigFilename (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C941D965: FcConfigParseAndLoad (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C94130C6: FcInitLoadConfig (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C94131B5: FcInitLoadConfigAndFonts (in 
/usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C94133D4: FcInit (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C940882C: FcConfigGetCurrent (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C9413225: FcInitBringUptoDate (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C941582F: FcFontList (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0xED80C4B: QFontconfigDatabase::populateFontDatabase() 
(qfontconfigdatabase.cpp:335)
    by 0x6F3A2EB: initializeDb() (qfontdatabase_qpa.cpp:137)
    by 0x6F3ABBF: QFontDatabase::findFont(int, QFontPrivate const*, QFontDef 
const&, bool) (qfontdatabase_qpa.cpp:277)
  Address 0x1151a794 is 20 bytes inside a block of size 22 alloc'd
    at 0x4A074CD: malloc (vg_replace_malloc.c:236)
    by 0x32C9407FDC: ??? (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C940A447: FcConfigFilename (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C941D965: FcConfigParseAndLoad (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C94130C6: FcInitLoadConfig (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C94131B5: FcInitLoadConfigAndFonts (in 
/usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C94133D4: FcInit (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C940882C: FcConfigGetCurrent (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C9413225: FcInitBringUptoDate (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0x32C941582F: FcFontList (in /usr/lib64/libfontconfig.so.1.4.4)
    by 0xED80C4B: QFontconfigDatabase::populateFontDatabase() 
(qfontconfigdatabase.cpp:335)
    by 0x6F3A2EB: initializeDb() (qfontdatabase_qpa.cpp:137)

FontConfig's fault

[more FontConfig failures skipped]

 Invalid read of size 8
    at 0x32C4136C74: __strspn_sse42 (smmintrin.h:628)
    by 0x13ECDEC2: parseValue (xmlconfig.c:304)
    by 0x13ECEFF7: optInfoStartElem (xmlconfig.c:366)
    by 0x32C7C0AAF2: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0B8CD: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0878E: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0A11A: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0D6E1: XML_ParseBuffer (in /lib64/libexpat.so.1.5.2)
    by 0x13ECF9AB: driParseOptionInfo (xmlconfig.c:726)
    by 0x13E5010C: intelInitScreen2 (intel_screen.c:699)
    by 0x13ECD8EA: dri2CreateNewScreen (dri_util.c:85)
    by 0x7C791EE: dri2CreateScreen (dri2_glx.c:1069)
  Address 0x85dd3e0 is 0 bytes inside a block of size 4 alloc'd
    at 0x4A074CD: malloc (vg_replace_malloc.c:236)
    by 0x13ECEEDB: optInfoStartElem (xmlconfig.c:343)
    by 0x32C7C0AAF2: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0B8CD: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0878E: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0A11A: ??? (in /lib64/libexpat.so.1.5.2)
    by 0x32C7C0D6E1: XML_ParseBuffer (in /lib64/libexpat.so.1.5.2)
    by 0x13ECF9AB: driParseOptionInfo (xmlconfig.c:726)
    by 0x13E5010C: intelInitScreen2 (intel_screen.c:699)
    by 0x13ECD8EA: dri2CreateNewScreen (dri_util.c:85)
    by 0x7C791EE: dri2CreateScreen (dri2_glx.c:1069)
    by 0x7C524C8: __glXInitialize (glxext.c:780)

Probably a false positive, given the function name (SSE4.2 string function). 
See below for a similar in Qt. By the way, valgrind reports an 8-byte load, 
but it's actually a 16-byte load.

 Syscall param ioctl(generic) points to uninitialised byte(s)
    at 0x32C40E9CE7: ioctl (syscall-template.S:82)
    by 0x80F9787: drmIoctl (xf86drm.c:167)
    by 0x1488CDF8: drm_intel_bufmgr_gem_init (intel_bufmgr_gem.c:2362)
    by 0x13E50246: intelInitScreen2 (intel_screen.c:598)
    by 0x13ECD8EA: dri2CreateNewScreen (dri_util.c:85)
    by 0x7C791EE: dri2CreateScreen (dri2_glx.c:1069)
    by 0x7C524C8: __glXInitialize (glxext.c:780)
    by 0x7C4E376: glXGetFBConfigs (glxcmds.c:1665)
    by 0x7C4F307: glXChooseFBConfig (glxcmds.c:1625)
    by 0xED83F79: qglx_findConfig(_XDisplay*, int, QSurfaceFormat const&, int) 
(qglxconvenience.cpp:124)
    by 0xED841D8: qglx_findVisualInfo(_XDisplay*, int, QSurfaceFormat*) 
(qglxconvenience.cpp:169)
    by 0xED643DA: QXcbWindow::create() (qxcbwindow.cpp:215)
  Address 0x7feffe3e4 is on thread 1's stack

False positive or intel driver's fault.

 Invalid read of size 8
    at 0x6E374CB: qt_blend_argb32_on_argb32_ssse3(unsigned char*, int, 
unsigned char const*, int, int, int, int) (emmintrin.h:679)
    by 0x705CA4E: QRasterPaintEnginePrivate::drawImage(QPointF const&, QImage 
const&, void (*)(unsigned char*, int, unsigned char const*, int, int, int, 
int), QRect const&, int, QRect const&) (qpaintengine_raster.cpp:996)
    by 0x7062CB0: QRasterPaintEngine::drawImage(QPointF const&, QImage const&) 
(qpaintengine_raster.cpp:2109)
    by 0x7061CB6: QRasterPaintEngine::drawPixmap(QPointF const&, QPixmap 
const&) (qpaintengine_raster.cpp:1984)
    by 0x708168B: QPainter::drawPixmap(QPointF const&, QPixmap const&) 
(qpainter.cpp:5074)
    by 0x5E8717D: QPainter::drawPixmap(QPoint const&, QPixmap const&) 
(qpainter.h:778)
    by 0x5F3764A: QPlastiqueStyle::drawPrimitive(QStyle::PrimitiveElement, 
QStyleOption const*, QPainter*, QWidget const*) const 
(qplastiquestyle.cpp:1493)
    by 0x609962D: QToolBar::paintEvent(QPaintEvent*) (qtoolbar.cpp:1052)
    by 0x5E7DF08: QWidget::event(QEvent*) (qwidget.cpp:8014)
    by 0x6099C1F: QToolBar::event(QEvent*) (qtoolbar.cpp:1203)
    by 0x5E23D9F: QApplicationPrivate::notify_helper(QObject*, QEvent*) 
(qapplication.cpp:3628)
    by 0x5E23AA5: QApplication::notify(QObject*, QEvent*) 
(qapplication.cpp:3593)
  Address 0x1100ffe8 is 1,112 bytes inside a block of size 1,116 alloc'd
    at 0x4A074CD: malloc (vg_replace_malloc.c:236)
    by 0x6ECE847: QImageData::create(QSize const&, QImage::Format, int) 
(qimage.cpp:170)
    by 0x6ECED87: QImage::QImage(int, int, QImage::Format) (qimage.cpp:742)
    by 0x6F02592: QRasterPlatformPixmap::resize(int, int) 
(qpixmap_raster.cpp:106)
    by 0x6EFE31D: QPlatformPixmap::create(int, int, 
QPlatformPixmap::PixelType) (qplatformpixmap.cpp:55)
    by 0x6EF5A0E: QPixmap::doInit(int, int, int) (qpixmap.cpp:97)
    by 0x6EF5C08: QPixmap::QPixmap(QSize const&) (qpixmap.cpp:154)
    by 0x5F3717B: QPlastiqueStyle::drawPrimitive(QStyle::PrimitiveElement, 
QStyleOption const*, QPainter*, QWidget const*) const 
(qplastiquestyle.cpp:1462)
    by 0x609962D: QToolBar::paintEvent(QPaintEvent*) (qtoolbar.cpp:1052)
    by 0x5E7DF08: QWidget::event(QEvent*) (qwidget.cpp:8014)
    by 0x6099C1F: QToolBar::event(QEvent*) (qtoolbar.cpp:1203)
    by 0x5E23D9F: QApplicationPrivate::notify_helper(QObject*, QEvent*) 
(qapplication.cpp:3628)

False positive. The code intentionally loads more bytes than it needs because 
it will discard them and it will not cause a page fault.

 Conditional jump or move depends on uninitialised value(s)
    at 0x6E33763: double const& qMax<double>(double const&, double const&) (in 
/home/thiago/obj/qt/qt5/qtbase/lib/libQtGui.so.5.0.0)
    by 0x707A2AE: QPainter::setOpacity(double) (qpainter.cpp:2092)
    by 0x5707BFA: qdesigner_internal::IconButton::paintEvent(QPaintEvent*) 
(filterwidget.cpp:90)
    by 0x5E7DF08: QWidget::event(QEvent*) (qwidget.cpp:8014)
    by 0x5FA69AA: QAbstractButton::event(QEvent*) (qabstractbutton.cpp:1089)
    by 0x60A4BBE: QToolButton::event(QEvent*) (qtoolbutton.cpp:960)
    by 0x5E23D9F: QApplicationPrivate::notify_helper(QObject*, QEvent*) 
(qapplication.cpp:3628)
    by 0x5E23AA5: QApplication::notify(QObject*, QEvent*) 
(qapplication.cpp:3593)
    by 0x76F2C49: QCoreApplication::notifyInternal(QObject*, QEvent*) 
(qcoreapplication.cpp:694)
    by 0x5E25F5A: QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) 
(in /home/thiago/obj/qt/qt5/qtbase/lib/libQtWidgets.so.5.0.0)
    by 0x5E75538: QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, 
QPoint const&, int, QPainter*, QWidgetBackingStore*) (qwidget.cpp:5115)
    by 0x5E7658B: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, 
QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, 
QWidgetBackingStore*) (qwidget.cpp:5302)
  Uninitialised value was created by a heap allocation
    at 0x4A06FC7: operator new(unsigned long) (vg_replace_malloc.c:261)
    by 0x570817A: qdesigner_internal::FilterWidget::FilterWidget(QWidget*, 
qdesigner_internal::FilterWidget::LayoutMode) (filterwidget.cpp:161)
    by 0x56F1902: 
QtResourceView::QtResourceView(QDesignerFormEditorInterface*, QWidget*) 
(qtresourceview.cpp:605)
    by 0x4C9C3B6: 
QDesignerComponents::createResourceEditor(QDesignerFormEditorInterface*, 
QWidget*) (qdesigner_components.cpp:248)
    by 0x43B103: 
ResourceEditorToolWindow::ResourceEditorToolWindow(QDesignerWorkbench*) 
(qdesigner_toolwindow.cpp:323)
    by 0x43B9D4: 
QDesignerToolWindow::createStandardToolWindow(QDesignerToolWindow::StandardToolWindow, 
QDesignerWorkbench*) (qdesigner_toolwindow.cpp:422)
    by 0x43EE3F: QDesignerWorkbench::QDesignerWorkbench() 
(qdesigner_workbench.cpp:223)
    by 0x438CAA: QDesigner::initialize() (qdesigner.cpp:241)
    by 0x437854: QDesigner::QDesigner(int&, char**) (qdesigner.cpp:98)
    by 0x4375B7: main (main.cpp:54)

The true positive I said I had found. Also happens in Qt 4.8.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center
     Intel Sweden AB - Registration Number: 556189-6027
     Knarrarnäsgatan 15, 164 40 Kista, Stockholm, Sweden
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20120327/b1f0f637/attachment.sig>


More information about the Interest mailing list