summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qbitarray.h
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2012-09-26 12:32:52 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-09-29 02:31:35 +0200
commit8e90e0805f2981014d3382d8841617b4c56dfc50 (patch)
tree5aa341addb3fca877b34436f23f483937ab972c7 /src/corelib/tools/qbitarray.h
parent4c33efc3228d82a82e13fe8c196b8c74a4998572 (diff)
Prevent an overflow warning in assertions.
Functions like QByteArray::at() assert the given index: Q_ASSERT(i >= 0 && i < size(); These functions typically get inlined. Now if the index is e.g. size() - 2, then gcc will emit an ugly warning in client code ("assuming signed overflow does not occur when assuming that (X - c) > X is always false"). This can be easily prevented by casting both sides of the second comparison in the assertion to their unsigned type. The explicit comparison to zero is then no longer necessary, since that condition is tested implicitly by the other comparison due to unsigned arithmetic. Change-Id: Ic7244e1fa5da00a47d1fe0ed56fb81c23d444dfe Reviewed-by: hjk <qthjk@ovi.com> Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qbitarray.h')
-rw-r--r--src/corelib/tools/qbitarray.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/corelib/tools/qbitarray.h b/src/corelib/tools/qbitarray.h
index 8fc86b0746..aa9c9620fc 100644
--- a/src/corelib/tools/qbitarray.h
+++ b/src/corelib/tools/qbitarray.h
@@ -120,22 +120,22 @@ Q_CORE_EXPORT QBitArray operator|(const QBitArray &, const QBitArray &);
Q_CORE_EXPORT QBitArray operator^(const QBitArray &, const QBitArray &);
inline bool QBitArray::testBit(int i) const
-{ Q_ASSERT(i >= 0 && i < size());
+{ Q_ASSERT(uint(i) < uint(size()));
return (*(reinterpret_cast<const uchar*>(d.constData())+1+(i>>3)) & (1 << (i & 7))) != 0; }
inline void QBitArray::setBit(int i)
-{ Q_ASSERT(i >= 0 && i < size());
+{ Q_ASSERT(uint(i) < uint(size()));
*(reinterpret_cast<uchar*>(d.data())+1+(i>>3)) |= uchar(1 << (i & 7)); }
inline void QBitArray::clearBit(int i)
-{ Q_ASSERT(i >= 0 && i < size());
+{ Q_ASSERT(uint(i) < uint(size()));
*(reinterpret_cast<uchar*>(d.data())+1+(i>>3)) &= ~uchar(1 << (i & 7)); }
inline void QBitArray::setBit(int i, bool val)
{ if (val) setBit(i); else clearBit(i); }
inline bool QBitArray::toggleBit(int i)
-{ Q_ASSERT(i >= 0 && i < size());
+{ Q_ASSERT(uint(i) < uint(size()));
uchar b = uchar(1<<(i&7)); uchar* p = reinterpret_cast<uchar*>(d.data())+1+(i>>3);
uchar c = uchar(*p&b); *p^=b; return c!=0; }