Den 15-03-2016 kl. 14:07 skrev Marc Mutz:
Hi,

No, this is not about the +1.

QRect is internally represented as QPoint topLeft, bottomRight, which means it
can hold rectangles for which width() and height(), returning ints, may
overflow, e.g.

    QRect{{INT_MIN, INT_MIN}, QPoint{0, 0}}
    QRect{{INT_MIN, INT_MIN}, QPoint{INT_MAX, INT_MAX}}

While these may seem like pathological cases that never occur in practice, the
auto-test checks such rectangles, and if it didn't the next attacker would.

It is therefore important to provide a fix width() and height().

There are two options I can see:

    qint64 width64() const;
    unsigned int width??() const;

The first returns the result as a 64-bit quantitiy, preserving the negative
widths of unnormalised rectangles, and never overflowing, but possibly
penalises 32-bit platforms without 64-bit register support.

The second still overflows for left() == INT_MIN, right() == INT_MAX, because
of the +1 (don't highjack this thread, you have been warned! :), would only
work on normalized rects, but doesn't require a 64-bit quantitiy.

Opinions on which one to choose? One? The other? Both?

There is another option that doesn't mean a change of signature: Bound the result. So if the real result is > INT_MAX, return INT_MAX. Same for INT_MIN.

Yes, it's not the correct result, but I completely agree with you that it's a theoretical problem. As long as it's documented in the width() I really don't see the problem with this solution.

Bo Thorsen,
Director, Viking Software.

--
Viking Software
Qt and C++ developers for hire
http://www.vikingsoft.eu
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to