From c5beecbcc09a5777a87e38a4308849bac0349e5f Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 25 Mar 2025 13:53:00 +0100 Subject: [PATCH] tst_QGraphicsItem: check that qgraphicsitem_cast casts correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC, with ubsan and optimization enabled, issues -Warray-bounds for the cast from &polygonItem to QGraphicsTextItem*, because the latter is-a QObject and the former is not, so the cast has to adjust the pointer value to correct for the fact that QGraphicsItem is not the first base class of QGraphicsTextItem: qgraphicsitem.h:973:56: warning: array subscript -1 is outside array bounds of ‘QGraphicsPolygonItem [1]’ [-Warray-bounds] 973 | || (item && int(Item::Type) == item->type()) ? static_cast(item) : nullptr; | ^~~~~~~~~~~~~~~~~~~~ tst_qgraphicsitem.cpp:3193:26: note: while referencing ‘polygonItem’ Check the implementation is correct in this respect by not just checking for nullptr or non-nullptr, but checking that the result matches what dynamic_cast produces. We can assume dynamic_cast works on QGraphicsItems because QPA is using dynamic_cast, so both QtGui and QtWidgets need to have been compiled with RTTI enabled. This doesn't eliminate the GCC warning, but confirms that it is a False Positive. Pick-to: 6.8 6.5 Change-Id: Ifc262cb6e715e8e68c180855adc2467960da89a1 Reviewed-by: Volker Hilsheimer (cherry picked from commit 101427957b59b715d0865cbdba12590fe11d1d10) Reviewed-by: Qt Cherry-pick Bot --- .../qgraphicsitem/tst_qgraphicsitem.cpp | 96 ++++++++++++------- 1 file changed, 64 insertions(+), 32 deletions(-) diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 7c40afb2471..cb0200bae7a 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -3191,46 +3191,78 @@ void tst_QGraphicsItem::graphicsitem_cast() QGraphicsTextItem textItem; const QGraphicsTextItem *pTextItem = &textItem; - QVERIFY(qgraphicsitem_cast(&pathItem)); - //QVERIFY(qgraphicsitem_cast(&pathItem)); - QVERIFY(qgraphicsitem_cast(&pathItem)); - QVERIFY(qgraphicsitem_cast(pPathItem)); - QVERIFY(qgraphicsitem_cast(pPathItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&pathItem), + dynamic_cast(&pathItem)); + //QCOMPARE_EQ(qgraphicsitem_cast(&pathItem), + // dynamic_cast(&pathItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&pathItem), + dynamic_cast(&pathItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPathItem), + dynamic_cast(pPathItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPathItem), + dynamic_cast(pPathItem)); - QVERIFY(qgraphicsitem_cast(&rectItem)); - QVERIFY(qgraphicsitem_cast(&rectItem)); - QVERIFY(qgraphicsitem_cast(pRectItem)); - QVERIFY(qgraphicsitem_cast(pRectItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&rectItem), + dynamic_cast(&rectItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&rectItem), + dynamic_cast(&rectItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pRectItem), + dynamic_cast(pRectItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pRectItem), + dynamic_cast(pRectItem)); - QVERIFY(qgraphicsitem_cast(&ellipseItem)); - QVERIFY(qgraphicsitem_cast(&ellipseItem)); - QVERIFY(qgraphicsitem_cast(pEllipseItem)); - QVERIFY(qgraphicsitem_cast(pEllipseItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&ellipseItem), + dynamic_cast(&ellipseItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&ellipseItem), + dynamic_cast(&ellipseItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pEllipseItem), + dynamic_cast(pEllipseItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pEllipseItem), + dynamic_cast(pEllipseItem)); - QVERIFY(qgraphicsitem_cast(&polygonItem)); - //QVERIFY(qgraphicsitem_cast(&polygonItem)); - QVERIFY(qgraphicsitem_cast(&polygonItem)); - QVERIFY(qgraphicsitem_cast(pPolygonItem)); - QVERIFY(qgraphicsitem_cast(pPolygonItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&polygonItem), + dynamic_cast(&polygonItem)); + //QCOMPARE_EQ(qgraphicsitem_cast(&polygonItem), + // dynamic_cast(&polygonItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&polygonItem), + dynamic_cast(&polygonItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPolygonItem), + dynamic_cast(pPolygonItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPolygonItem), + dynamic_cast(pPolygonItem)); - QVERIFY(qgraphicsitem_cast(&lineItem)); - QVERIFY(qgraphicsitem_cast(&lineItem)); - QVERIFY(qgraphicsitem_cast(pLineItem)); - QVERIFY(qgraphicsitem_cast(pLineItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&lineItem), + dynamic_cast(&lineItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&lineItem), + dynamic_cast(&lineItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pLineItem), + dynamic_cast(pLineItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pLineItem), + dynamic_cast(pLineItem)); - QVERIFY(qgraphicsitem_cast(&pixmapItem)); - QVERIFY(qgraphicsitem_cast(&pixmapItem)); - QVERIFY(qgraphicsitem_cast(pPixmapItem)); - QVERIFY(qgraphicsitem_cast(pPixmapItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&pixmapItem), + dynamic_cast(&pixmapItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&pixmapItem), + dynamic_cast(&pixmapItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPixmapItem), + dynamic_cast(pPixmapItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPixmapItem), + dynamic_cast(pPixmapItem)); - QVERIFY(qgraphicsitem_cast(&textItem)); - QVERIFY(qgraphicsitem_cast(&textItem)); - QVERIFY(qgraphicsitem_cast(pTextItem)); - QVERIFY(qgraphicsitem_cast(pTextItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&textItem), + dynamic_cast(&textItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&textItem), + dynamic_cast(&textItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pTextItem), + dynamic_cast(pTextItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pTextItem), + dynamic_cast(pTextItem)); // and some casts that _should_ fail: - QVERIFY(!qgraphicsitem_cast(&pathItem)); - QVERIFY(!qgraphicsitem_cast(pPolygonItem)); + QCOMPARE_EQ(qgraphicsitem_cast(&pathItem), + dynamic_cast(&pathItem)); + QCOMPARE_EQ(qgraphicsitem_cast(pPolygonItem), + dynamic_cast(pPolygonItem)); // and this shouldn't crash QGraphicsItem *ptr = nullptr;