c++qtqt4segmentation-faultqimage

QPixmap fromImage results in Segmentation fault


I'm at a complete loss here...

I'm trying to convert a QImage to a QPixmap but my program keeps crashing with the following stack trace. What's weird is it works fine if the QRectF that I specify doesn't have an upper left point of (0, 0). I know QImage has a copy method as well, but that was also failing (with no useful stacktrace), so I figured I'd try to work with Pixmaps instead... Line's 4/5 of the stacktrace are mine, but I'm basically doing the following

QImage _drawing = QImage(1024, 1024);
// fill _drawing with some data

QRect i_work = QRect(1, 1, 10, 10);
QRect i_break = QRect(0, 0, 10, 10);

QPixmap foo = QPixmap::fromImage(_drawing);
// QPixmap good = foo.copy(i_work); // I work
QPixmap broken = foo.copy(i_break); // Segmentation fault...

StackTrace:

Program received signal SIGSEGV, Segmentation fault.
0x01f44024 in QBasicAtomicInt::ref (this=0xabababab)
    at ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h:120
120     ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h: No such file
 or directory.
        in ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h
(gdb) bt
#0  0x01f44024 in QBasicAtomicInt::ref (this=0xabababab)
    at ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h:120
#1  0x01964d3e in QImage::QImage (this=0x28cc70, image=...)
    at image\qimage.cpp:1125
#2  0x01990682 in QRasterPixmapData::fromImage (this=0xc391a00,
    sourceImage=..., flags=...) at image\qpixmap_raster.cpp:151
#3  0x019862ab in QPixmap::fromImage (image=..., flags=...)
    at image\qpixmap.cpp:2031
#4  0x00423fdc in TxImage::getSelection (this=0xc3b6cb0, selection_area=...)
    at TxImage.cpp:207
#5  0x004421e2 in RomView::mouseReleaseEvent (this=0xc397978, event=0x28d5fc)
    at RomView.cpp:261
#6  0x019241a0 in QWidget::event (this=0xc397978, event=0x28d5fc)
    at kernel\qwidget.cpp:8187
#7  0x01c9e6bc in QFrame::event (this=0xc397978, e=0x28d5fc)
    at widgets\qframe.cpp:557
#8  0x01d2bf0f in QAbstractScrollArea::viewportEvent (this=0xc397978,
    e=0x28d5fc) at widgets\qabstractscrollarea.cpp:1043
#9  0x01e9aae6 in QGraphicsView::viewportEvent (this=0xc397978,
    event=0x28d5fc) at graphicsview\qgraphicsview.cpp:2862
#10 0x01f86a13 in QAbstractScrollAreaPrivate::viewportEvent (this=0xc3969f8,
    event=0x28d5fc) at widgets//qabstractscrollarea_p.h:100
#11 0x01f8506c in QAbstractScrollAreaFilter::eventFilter (this=0xbfa7388, o=
    0xbf43978, e=0x28d5fc) at widgets//qabstractscrollarea_p.h:116
#12 0x6a1ffc73 in QCoreApplicationPrivate::sendThroughObjectEventFilters (
    this=0xa7a46d8, receiver=0xbf43978, event=0x28d5fc)
    at kernel\qcoreapplication.cpp:847
#13 0x018d96e5 in QApplicationPrivate::notify_helper (this=0xa7a46d8,
    receiver=0xbf43978, e=0x28d5fc) at kernel\qapplication.cpp:4392
#14 0x018d7909 in QApplication::notify (this=0x28fe34, receiver=0xbf43978,
    e=0x28d5fc) at kernel\qapplication.cpp:3959
#15 0x6a1ff9dc in QCoreApplication::notifyInternal (this=0x28fe34,
    receiver=0xbf43978, event=0x28d5fc) at kernel\qcoreapplication.cpp:732
#16 0x01f4d53e in QCoreApplication::sendSpontaneousEvent (receiver=0xbf43978,
    event=0x28d5fc)
    at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:218
#17 0x018d6118 in QApplicationPrivate::sendMouseEvent (receiver=0xbf43978,
    event=0x28d5fc, alienWidget=0xc3adb70, nativeWidget=0x28fd60,
    buttonDown=0x237941c, lastMouseReceiver=..., spontaneous=true)
    at kernel\qapplication.cpp:3056
#18 0x0193fc63 in QETWidget::translateMouseEvent (this=0x28fd60, msg=...)
    at kernel\qapplication_win.cpp:3317
#19 0x0193aaa6 in QtWndProc (hwnd=0x130fb8, message=514, wParam=0,
    lParam=5373956) at kernel\qapplication_win.cpp:1657
#20 0x762c62fa in USER32!OffsetRect () from C:\Windows\syswow64\user32.dll
#21 0x900010c2 in ?? ()
#22 0x90909090 in ?? ()
#23 0x00df7d80 in operator+ ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb)

I assure you that qatomic_i386.h exists and looking at line 120...

112: inline bool QBasicAtomicInt::ref()
113: {
114:     unsigned char ret;
115:    asm volatile("lock\n"
116:                 "incl %0\n"
117:                 "setne %1"
118:                 : "=m" (_q_value), "=qm" (ret)
119:                 : "m" (_q_value)
120:                 : "memory");
121:    return ret != 0;
122: }

Solution

  • I was successfully able to solve the problem, but I'm not sure of the underlying problem, as the workaround doesn't really make a whole lot of sense to me.

    So I was rendering the QImage on a QGraphicsScene/QGraphicsView. I had my QImage at location (0,0) on the scene and another QGraphicsItem also at location (0,0). Removing the other QGraphicsItem from the scene before calling copy on the QImage seemed to fix the problem. I've no idea what's so special about the point (0,0). The only thing I can think of is that isNull on a QPoint(0,0) returns true.