Changeset 206151 in webkit


Ignore:
Timestamp:
Sep 20, 2016 10:14:00 AM (8 years ago)
Author:
Jonathan Bedard
Message:

Undefined behavior: Left shift negative number
https://bugs.webkit.org/show_bug.cgi?id=161866

Reviewed by Keith Miller.

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.

Source/JavaScriptCore:

  • dfg/DFGAbstractHeap.h:

(JSC::DFG::AbstractHeap::encode): Explicitly cast signed integer for left shift.

Source/WTF:

  • wtf/text/Base64.cpp:

(WTF::base64EncodeInternal): Changed signed character to unsigned when shifting.
(WTF::base64Encode): Ditto.
(WTF::base64URLEncode): Ditto.
(WTF::base64DecodeInternal): Ditto.

  • wtf/text/Base64.h: Ditto.

(WTF::SignedOrUnsignedCharVectorAdapter): Rebuilt to stop using union as a bitwise_cast.
(WTF::ConstSignedOrUnsignedCharVectorAdapter): Ditto.

Location:
trunk/Source
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r206149 r206151  
     12016-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
    1132016-09-20  Saam Barati  <sbarati@apple.com>
    214
  • trunk/Source/JavaScriptCore/dfg/DFGAbstractHeap.h

    r197549 r206151  
    299299        int64_t kindAsInt = static_cast<int64_t>(kind);
    300300        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);
    302302    }
    303303   
  • trunk/Source/WTF/ChangeLog

    r206119 r206151  
     12016-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
    1192016-09-19  Daniel Bates  <dabates@apple.com>
    220
  • trunk/Source/WTF/wtf/text/Base64.cpp

    r195694 r206151  
    9393};
    9494
    95 static inline void base64EncodeInternal(const char* data, unsigned len, Vector<char>& out, Base64EncodePolicy policy, const char (&encodeMap)[64])
     95static inline void base64EncodeInternal(const unsigned char* data, unsigned len, Vector<char>& out, Base64EncodePolicy policy, const char (&encodeMap)[64])
    9696{
    9797    out.clear();
     
    161161{
    162162    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);
    164164    return String(result.data(), result.size());
    165165}
     
    167167void base64Encode(const void* data, unsigned len, Vector<char>& out, Base64EncodePolicy policy)
    168168{
    169     base64EncodeInternal(static_cast<const char*>(data), len, out, policy, base64EncMap);
     169    base64EncodeInternal(static_cast<const unsigned char*>(data), len, out, policy, base64EncMap);
    170170}
    171171
     
    173173{
    174174    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);
    176176    return String(result.data(), result.size());
    177177}
     
    179179void base64URLEncode(const void* data, unsigned len, Vector<char>& out)
    180180{
    181     base64EncodeInternal(static_cast<const char*>(data), len, out, Base64URLPolicy, base64URLEncMap);
     181    base64EncodeInternal(static_cast<const unsigned char*>(data), len, out, Base64URLPolicy, base64URLEncMap);
    182182}
    183183
    184184template<typename T>
    185 static inline bool base64DecodeInternal(const T* data, unsigned length, Vector<char>& out, unsigned options, const char (&decodeMap)[128])
     185static inline bool base64DecodeInternal(const T* data, unsigned length, SignedOrUnsignedCharVectorAdapter& out, unsigned options, const char (&decodeMap)[128])
    186186{
    187187    out.clear();
  • trunk/Source/WTF/wtf/text/Base64.h

    r195694 r206151  
    4949class SignedOrUnsignedCharVectorAdapter {
    5050public:
    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]; }
    56104
    57105private:
     106    bool m_isSigned;
    58107    union {
    59108        Vector<char>* c;
     
    64113class ConstSignedOrUnsignedCharVectorAdapter {
    65114public:
    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    }
    72138
    73139private:
     140    bool m_isSigned;
    74141    union {
    75142        const Vector<char>* c;
Note: See TracChangeset for help on using the changeset viewer.