From: Martin Zaun Date: February 19 2011 2:47am Subject: bzr commit into mysql-5.1-telco-6.3 branch (martin.zaun:3389) List-Archive: http://lists.mysql.com/commits/131669 Message-Id: <201102190248.p1J2m3lv021200@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2045830209301614053==" --===============2045830209301614053== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mz/mysql/ndb-6.3-wl5421/ based on revid:martin.zaun@stripped 3389 Martin Zaun 2011-02-18 ndb_restore - fix pedantic compiler warnings in template refactorization modified: storage/ndb/include/util/NdbTypesUtil.hpp storage/ndb/tools/restore/consumer_restore.cpp === modified file 'storage/ndb/include/util/NdbTypesUtil.hpp' --- a/storage/ndb/include/util/NdbTypesUtil.hpp 2011-02-18 18:07:44 +0000 +++ b/storage/ndb/include/util/NdbTypesUtil.hpp 2011-02-19 02:47:10 +0000 @@ -66,7 +66,7 @@ struct ArrayTypeTraits { static bool isFixedSized(); // the size of the length prefix in bytes, or zero if a fixed-sized array - static size_t lengthPrefixSize(); + static Uint32 lengthPrefixSize(); }; // aliases for array type traits @@ -109,7 +109,7 @@ struct NumTypeTraits { static bool isSigned() { return NumTypeMap< T >::isSigned(); }; // the width of the type in bytes - static size_t size(); + static Uint32 size(); // the minimum finite value static T lowest(); @@ -184,7 +184,7 @@ struct ArrayTypeHelper : ArrayTypeTraits static Uint32 readLengthPrefix(const void * a); // write the length prefix (not available if a fixed-sized array) - // the upper (non-length-prefix) bytes of 'l' must be zero + // the non-length-prefix bytes of 'l' must be zero static void writeLengthPrefix(void * a, Uint32 l); }; @@ -275,7 +275,7 @@ typedef NonStdNumTypeHelper< Uint32 > Hu #define NDB_SPECIALIZE_ARRAY_TYPE_TRAITS( TR, B, FS, LPS ) \ template<> inline bool TR::isBinary() { return B; } \ template<> inline bool TR::isFixedSized() { return FS; } \ - template<> inline size_t TR::lengthPrefixSize() { return LPS; } + template<> inline Uint32 TR::lengthPrefixSize() { return LPS; } // coincidentally, we could use ndb constants // NDB_ARRAYTYPE_FIXED, NDB_ARRAYTYPE_SHORT_VAR, NDB_ARRAYTYPE_MEDIUM_VAR @@ -313,7 +313,7 @@ NDB_SPECIALIZE_NUM_TYPE_MAP(double, doub // specialize the Traits template members for numeric types #define NDB_SPECIALIZE_NUM_TYPE_TRAITS( TR, T, SZ, LO, HI, SM ) \ - template<> inline size_t TR::size() { return SZ; } \ + template<> inline Uint32 TR::size() { return SZ; } \ template<> inline T TR::lowest() { return LO; } \ template<> inline T TR::highest() { return HI; } \ template<> inline T TR::smallest() { return SM; } @@ -347,10 +347,12 @@ NDB_SPECIALIZE_NON_STD_NUM_TYPE_TRAITS(T #define NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS0( H ) \ template<> inline Uint32 H::readLengthPrefix(const void * a) { \ assert(false); \ + (void)a; \ return 0; \ }; \ template<> inline void H::writeLengthPrefix(void * a, Uint32 l) { \ assert(false); \ + (void)a; (void)l; \ } NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS0(Hchar) @@ -361,13 +363,13 @@ NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS0(Hb #define NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS1( H ) \ template<> inline Uint32 H::readLengthPrefix(const void * a) { \ assert(a); \ - const unsigned char * s = static_cast(a); \ + const Uint8 * s = static_cast(a); \ return s[0]; \ }; \ template<> inline void H::writeLengthPrefix(void * a, Uint32 l) { \ assert(a); \ assert(l >> (lengthPrefixSize() * 8) == 0); \ - unsigned char * t = static_cast(a); \ + Uint8 * t = static_cast(a); \ t[0] = l & 0x000000FF; \ } @@ -379,15 +381,15 @@ NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS1(Hv #define NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS2( H ) \ template<> inline Uint32 H::readLengthPrefix(const void * a) { \ assert(a); \ - const unsigned char * s = static_cast(a); \ - return s[0] + (s[1] << 8); \ + const Uint8 * s = static_cast(a); \ + return static_cast(s[0] + (s[1] << 8)); \ }; \ template<> inline void H::writeLengthPrefix(void * a, Uint32 l) { \ assert(a); \ assert(l >> (lengthPrefixSize() * 8) == 0); \ - unsigned char * t = static_cast(a); \ - t[0] = l & 0x000000FF; \ - t[1] = (l & 0x0000FF00) >> 8; \ + Uint8 * t = static_cast(a); \ + t[0] = static_cast(l & 0x000000FF); \ + t[1] = static_cast((l & 0x0000FF00) >> 8); \ } NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS2(Hlongvarchar) @@ -398,10 +400,11 @@ NDB_SPECIALIZE_ARRAY_TYPE_HELPER_LPS2(Hl #define NDB_SPECIALIZE_NUM_TYPE_HELPER_BYTE( H, T ) \ template<> inline void H::load(T * t, const char * s) { \ assert(t); assert(s); assert(t != (const T *)s); \ - *t = *s; \ + *t = static_cast(*s); \ } \ template<> inline void H::store(char * t, const T * s) { \ - H::load((T *)t, (const char *)s); \ + H::load(reinterpret_cast(t), \ + reinterpret_cast(s)); \ } NDB_SPECIALIZE_NUM_TYPE_HELPER_BYTE(Hint8, Int8); @@ -411,12 +414,12 @@ NDB_SPECIALIZE_NUM_TYPE_HELPER_BYTE(Huin // specialize the Helper template members for numeric types #define NDB_SPECIALIZE_NUM_TYPE_HELPER( H, T ) \ template<> inline void H::load(T * t, const char * s) { \ - assert(t); assert(s); \ - assert(t != (const T *)s); \ + assert(t); assert(s); assert(t != (const T *)s); \ memcpy(t, s, H::size()); \ } \ template<> inline void H::store(char * t, const T * s) { \ - H::load((T *)t, (const char *)s); \ + H::load(reinterpret_cast(t), \ + reinterpret_cast(s)); \ } NDB_SPECIALIZE_NUM_TYPE_HELPER(Hint16, Int16); === modified file 'storage/ndb/tools/restore/consumer_restore.cpp' --- a/storage/ndb/tools/restore/consumer_restore.cpp 2011-02-18 18:07:44 +0000 +++ b/storage/ndb/tools/restore/consumer_restore.cpp 2011-02-19 02:47:10 +0000 @@ -155,20 +155,22 @@ BackupRestore::convert_integral(const vo // Under ansi (and even more K&R) C promotion rules, if 'T' is unsigned // and if there's no larger signed type available, the value 's' gets // promoted to unsigned; then, a negative value of 's' becomes (large) - // positive -- with a wrong comparison outcome. Furthermore, no "mixed - // signedness comparison" compiler warnings should be triggered for any - // specialization of integral types 'S' and 'T'. + // positive -- with a wrong comparison outcome. + // + // Furthermore, the code should not trigger compiler warnings for any + // selection of integral types 'S', 'T' ("mixed signedness comparison", + // "comparison of unsigned expression <0 / >=0 is always false/true"). // // The correct approach: do lower bound comparisons on signed types and // upper bound comparisons on unsigned types only; this requires casts. // For the casts to be safe, compare the value against the zero literal - // if (s < 0) { check as signed } else if (s > 0) { check as unsigned } - // which is always a valid test, for signed and unsigned types. + // if (s <= 0) { check as signed } else { check as unsigned } + // which is a valid + nontrivial test for signed and unsigned types. // // This implies that correct, generic conversion code must test into // which of these _four_ subranges value 's' falls - // ... < T's lower bound <= ... <= 0 <= ... <= T's upper bound < ... - // while handling 's' as signed/unsigned where less/greater zero. + // ... < T's lower bound <= ... <= 0 < ... <= T's upper bound < ... + // while handling 's' as signed/unsigned where less-equal/greater zero. // // Obviously, simplifications are possible if 'S' is unsigned or known // to be a subset of 'T'. This can be accomplished by a few additional @@ -177,12 +179,7 @@ BackupRestore::convert_integral(const vo // write the target value typename T::DomainT t; - if (s == 0) { // fast track case - - t = 0; - truncated = false; - - } else if (s < 0) { // compile-time expr if S is unsigned + if (s <= 0) { // check value against lower bound as _signed_, safe since all <= 0 assert(S::lowest() <= 0 && T::lowest() <= 0 && s <= 0); @@ -200,8 +197,8 @@ BackupRestore::convert_integral(const vo } else { // (s > 0) - // check value against upper bound as _unsigned_, safe since all >= 0 - assert(S::highest() >= 0 && T::highest() >= 0 && s >= 0); + // check value against upper bound as _unsigned_, safe since all > 0 + assert(S::highest() > 0 && T::highest() > 0 && s > 0); const typename S::UnsignedT s_h_u = S::asUnsigned(S::highest()); const typename T::UnsignedT t_h_u = T::asUnsigned(T::highest()); const typename S::UnsignedT s_u = S::asUnsigned(s); --===============2045830209301614053== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.zaun@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.zaun@stripped # target_branch: file:///Users/mz/mysql/ndb-6.3-wl5421/ # testament_sha1: a909349b5a02ab68ea3bfc9cfd26b1f40bc79e33 # timestamp: 2011-02-18 18:47:16 -0800 # base_revision_id: martin.zaun@stripped\ # 5paqgez4gdkpj3c2 # # Begin bundle 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 --===============2045830209301614053==--