Changeset 206151 in webkit
- Timestamp:
- Sep 20, 2016 10:14:00 AM (8 years ago)
- Location:
- trunk/Source
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r206149 r206151 1 2016-09-20 Jonathan Bedard <jbedard@apple.com> 2 3 Undefined behavior: Left shift negative number 4 https://bugs.webkit.org/show_bug.cgi?id=161866 5 6 Reviewed by Keith Miller. 7 8 Left shifting a negative number is undefined behavior in C/C++, although most implementations do define it. Explicitly clarifying the intended behavior due to shifting negative number in some cases. 9 10 * dfg/DFGAbstractHeap.h: 11 (JSC::DFG::AbstractHeap::encode): Explicitly cast signed integer for left shift. 12 1 13 2016-09-20 Saam Barati <sbarati@apple.com> 2 14 -
trunk/Source/JavaScriptCore/dfg/DFGAbstractHeap.h
r197549 r206151 299 299 int64_t kindAsInt = static_cast<int64_t>(kind); 300 300 ASSERT(kindAsInt < (1 << topShift)); 301 return kindAsInt | ( payload.isTop() << topShift) | (payload.valueImpl() << valueShift);301 return kindAsInt | (static_cast<uint64_t>(payload.isTop()) << topShift) | (bitwise_cast<uint64_t>(payload.valueImpl()) << valueShift); 302 302 } 303 303 -
trunk/Source/WTF/ChangeLog
r206119 r206151 1 2016-09-20 Jonathan Bedard <jbedard@apple.com> 2 3 Undefined behavior: Left shift negative number 4 https://bugs.webkit.org/show_bug.cgi?id=161866 5 6 Reviewed by Keith Miller. 7 8 Left shifting a negative number is undefined behavior in C/C++, although most implementations do define it. Explicitly clarifying the intended behavior due to shifting negative number in some cases. 9 10 * wtf/text/Base64.cpp: 11 (WTF::base64EncodeInternal): Changed signed character to unsigned when shifting. 12 (WTF::base64Encode): Ditto. 13 (WTF::base64URLEncode): Ditto. 14 (WTF::base64DecodeInternal): Ditto. 15 * wtf/text/Base64.h: Ditto. 16 (WTF::SignedOrUnsignedCharVectorAdapter): Rebuilt to stop using union as a bitwise_cast. 17 (WTF::ConstSignedOrUnsignedCharVectorAdapter): Ditto. 18 1 19 2016-09-19 Daniel Bates <dabates@apple.com> 2 20 -
trunk/Source/WTF/wtf/text/Base64.cpp
r195694 r206151 93 93 }; 94 94 95 static inline void base64EncodeInternal(const char* data, unsigned len, Vector<char>& out, Base64EncodePolicy policy, const char (&encodeMap)[64])95 static inline void base64EncodeInternal(const unsigned char* data, unsigned len, Vector<char>& out, Base64EncodePolicy policy, const char (&encodeMap)[64]) 96 96 { 97 97 out.clear(); … … 161 161 { 162 162 Vector<char> result; 163 base64EncodeInternal(static_cast<const char*>(data), length, result, policy, base64EncMap);163 base64EncodeInternal(static_cast<const unsigned char*>(data), length, result, policy, base64EncMap); 164 164 return String(result.data(), result.size()); 165 165 } … … 167 167 void base64Encode(const void* data, unsigned len, Vector<char>& out, Base64EncodePolicy policy) 168 168 { 169 base64EncodeInternal(static_cast<const char*>(data), len, out, policy, base64EncMap);169 base64EncodeInternal(static_cast<const unsigned char*>(data), len, out, policy, base64EncMap); 170 170 } 171 171 … … 173 173 { 174 174 Vector<char> result; 175 base64EncodeInternal(static_cast<const char*>(data), length, result, Base64URLPolicy, base64URLEncMap);175 base64EncodeInternal(static_cast<const unsigned char*>(data), length, result, Base64URLPolicy, base64URLEncMap); 176 176 return String(result.data(), result.size()); 177 177 } … … 179 179 void base64URLEncode(const void* data, unsigned len, Vector<char>& out) 180 180 { 181 base64EncodeInternal(static_cast<const char*>(data), len, out, Base64URLPolicy, base64URLEncMap);181 base64EncodeInternal(static_cast<const unsigned char*>(data), len, out, Base64URLPolicy, base64URLEncMap); 182 182 } 183 183 184 184 template<typename T> 185 static inline bool base64DecodeInternal(const T* data, unsigned length, Vector<char>& out, unsigned options, const char (&decodeMap)[128])185 static inline bool base64DecodeInternal(const T* data, unsigned length, SignedOrUnsignedCharVectorAdapter& out, unsigned options, const char (&decodeMap)[128]) 186 186 { 187 187 out.clear(); -
trunk/Source/WTF/wtf/text/Base64.h
r195694 r206151 49 49 class SignedOrUnsignedCharVectorAdapter { 50 50 public: 51 SignedOrUnsignedCharVectorAdapter(Vector<char>& vector) { m_vector.c = &vector; } 52 SignedOrUnsignedCharVectorAdapter(Vector<uint8_t>& vector) { m_vector.u = &vector; } 53 54 operator Vector<char>&() { return *m_vector.c; } 55 void clear() { m_vector.c->clear(); } 51 SignedOrUnsignedCharVectorAdapter(Vector<char>& vector) 52 : m_isSigned(true) 53 { 54 m_vector.c = &vector; 55 } 56 SignedOrUnsignedCharVectorAdapter(Vector<uint8_t>& vector) 57 : m_isSigned(false) 58 { 59 m_vector.u = &vector; 60 } 61 62 uint8_t* data() 63 { 64 if (m_isSigned) 65 return reinterpret_cast<uint8_t*>(m_vector.c->data()); 66 return m_vector.u->data(); 67 } 68 69 size_t size() const 70 { 71 if (m_isSigned) 72 return m_vector.c->size(); 73 return m_vector.u->size(); 74 } 75 76 void clear() 77 { 78 if (m_isSigned) { 79 m_vector.c->clear(); 80 return; 81 } 82 m_vector.u->clear(); 83 } 84 85 void grow(size_t size) 86 { 87 if (m_isSigned) { 88 m_vector.c->grow(size); 89 return; 90 } 91 m_vector.u->grow(size); 92 } 93 94 void shrink(size_t size) 95 { 96 if (m_isSigned) { 97 m_vector.c->shrink(size); 98 return; 99 } 100 m_vector.u->shrink(size); 101 } 102 103 uint8_t& operator[](size_t position) { return data()[position]; } 56 104 57 105 private: 106 bool m_isSigned; 58 107 union { 59 108 Vector<char>* c; … … 64 113 class ConstSignedOrUnsignedCharVectorAdapter { 65 114 public: 66 ConstSignedOrUnsignedCharVectorAdapter(const Vector<char>& vector) { m_vector.c = &vector; } 67 ConstSignedOrUnsignedCharVectorAdapter(const Vector<uint8_t>& vector) { m_vector.u = &vector; } 68 69 operator const Vector<char>&() { return *m_vector.c; } 70 const char* data() const { return m_vector.c->data(); } 71 size_t size() const { return m_vector.c->size(); } 115 ConstSignedOrUnsignedCharVectorAdapter(const Vector<char>& vector) 116 : m_isSigned(false) 117 { 118 m_vector.c = &vector; 119 } 120 ConstSignedOrUnsignedCharVectorAdapter(const Vector<uint8_t>& vector) 121 : m_isSigned(true) 122 { 123 m_vector.u = &vector; 124 } 125 126 const uint8_t* data() const 127 { 128 if (m_isSigned) 129 return reinterpret_cast<const uint8_t*>(m_vector.c->data()); 130 return m_vector.u->data(); 131 } 132 size_t size() const 133 { 134 if (m_isSigned) 135 return m_vector.c->size(); 136 return m_vector.u->size(); 137 } 72 138 73 139 private: 140 bool m_isSigned; 74 141 union { 75 142 const Vector<char>* c;
Note: See TracChangeset
for help on using the changeset viewer.