Fix various undefined behaviours detected by UBSan
This commit is contained in:
parent
8a2ece78b7
commit
4e7a357a47
|
@ -34,7 +34,7 @@ public:
|
||||||
template<typename Alloc, typename U,
|
template<typename Alloc, typename U,
|
||||||
typename = typename std::enable_if<sizeof(U) == sizeof(T)>::type>
|
typename = typename std::enable_if<sizeof(U) == sizeof(T)>::type>
|
||||||
constexpr ArrayView(const std::vector<U, Alloc>& v)
|
constexpr ArrayView(const std::vector<U, Alloc>& v)
|
||||||
: m_pointer(&v[0]), m_size(v.size()) {}
|
: m_pointer(v.data()), m_size(v.size()) {}
|
||||||
|
|
||||||
constexpr ArrayView(const std::initializer_list<T>& v)
|
constexpr ArrayView(const std::initializer_list<T>& v)
|
||||||
: m_pointer(v.begin()), m_size(v.size()) {}
|
: m_pointer(v.begin()), m_size(v.size()) {}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "hash.hh"
|
#include "hash.hh"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
@ -32,11 +33,12 @@ size_t hash_data(const char* input, size_t len)
|
||||||
constexpr uint32_t c2 = 0x1b873593;
|
constexpr uint32_t c2 = 0x1b873593;
|
||||||
|
|
||||||
const int nblocks = len / 4;
|
const int nblocks = len / 4;
|
||||||
const uint32_t* blocks = reinterpret_cast<const uint32_t*>(data + nblocks*4);
|
const uint8_t* blocks = data + nblocks*4;
|
||||||
|
|
||||||
for (int i = -nblocks; i; ++i)
|
for (int i = -nblocks; i; ++i)
|
||||||
{
|
{
|
||||||
uint32_t key = blocks[i];
|
uint32_t key;
|
||||||
|
memcpy(&key, blocks + 4*i, 4);
|
||||||
key *= c1;
|
key *= c1;
|
||||||
key = rotl(key, 15);
|
key = rotl(key, 15);
|
||||||
key *= c2;
|
key *= c2;
|
||||||
|
|
|
@ -1014,7 +1014,7 @@ struct LineNumbersHighlighter : Highlighter
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void do_highlight(const Context& context, HighlightPass, DisplayBuffer& display_buffer, BufferRange)
|
void do_highlight(const Context& context, HighlightPass, DisplayBuffer& display_buffer, BufferRange) override
|
||||||
{
|
{
|
||||||
const Face face = get_face("LineNumbers");
|
const Face face = get_face("LineNumbers");
|
||||||
const Face face_wrapped = get_face("LineNumbersWrapped");
|
const Face face_wrapped = get_face("LineNumbersWrapped");
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
enum class MessageType : char
|
enum class MessageType : uint8_t
|
||||||
{
|
{
|
||||||
Unknown,
|
Unknown,
|
||||||
Connect,
|
Connect,
|
||||||
|
@ -54,7 +54,7 @@ public:
|
||||||
~MsgWriter() noexcept(false)
|
~MsgWriter() noexcept(false)
|
||||||
{
|
{
|
||||||
uint32_t count = (uint32_t)m_buffer.size() - m_start;
|
uint32_t count = (uint32_t)m_buffer.size() - m_start;
|
||||||
*reinterpret_cast<uint32_t*>(m_buffer.data() + m_start + 1) = count;
|
memcpy(m_buffer.data() + m_start + sizeof(MessageType), &count, sizeof(uint32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
void write(const char* val, size_t size)
|
void write(const char* val, size_t size)
|
||||||
|
@ -172,7 +172,9 @@ public:
|
||||||
uint32_t size() const
|
uint32_t size() const
|
||||||
{
|
{
|
||||||
kak_assert(m_write_pos >= header_size);
|
kak_assert(m_write_pos >= header_size);
|
||||||
return *reinterpret_cast<const uint32_t*>(m_stream.data()+1);
|
uint32_t res;
|
||||||
|
memcpy(&res, m_stream.data() + sizeof(MessageType), sizeof(uint32_t));
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageType type() const
|
MessageType type() const
|
||||||
|
|
|
@ -22,6 +22,7 @@ String::Data::Data(const char* data, size_t size, size_t capacity)
|
||||||
l.size = size;
|
l.size = size;
|
||||||
l.capacity = capacity;
|
l.capacity = capacity;
|
||||||
|
|
||||||
|
if (data != nullptr)
|
||||||
memcpy(l.ptr, data, size);
|
memcpy(l.ptr, data, size);
|
||||||
l.ptr[size] = 0;
|
l.ptr[size] = 0;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +102,9 @@ void String::Data::force_size(size_t new_size)
|
||||||
|
|
||||||
void String::Data::append(const char* str, size_t len)
|
void String::Data::append(const char* str, size_t len)
|
||||||
{
|
{
|
||||||
|
if (len == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
const size_t new_size = size() + len;
|
const size_t new_size = size() + len;
|
||||||
reserve(new_size);
|
reserve(new_size);
|
||||||
|
|
||||||
|
@ -147,6 +151,7 @@ void String::Data::set_size(size_t size)
|
||||||
void String::Data::set_short(const char* data, size_t size)
|
void String::Data::set_short(const char* data, size_t size)
|
||||||
{
|
{
|
||||||
s.size = (size << 1) | 1;
|
s.size = (size << 1) | 1;
|
||||||
|
if (data != nullptr)
|
||||||
memcpy(s.string, data, size);
|
memcpy(s.string, data, size);
|
||||||
s.string[size] = 0;
|
s.string[size] = 0;
|
||||||
}
|
}
|
||||||
|
@ -308,7 +313,7 @@ Optional<int> str_to_int_ifp(StringView str)
|
||||||
return {};
|
return {};
|
||||||
res = res * 10 + c - '0';
|
res = res * 10 + c - '0';
|
||||||
}
|
}
|
||||||
return negative ? -(int)res : (int)res;
|
return negative ? -res : res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_to_int(StringView str)
|
int str_to_int(StringView str)
|
||||||
|
|
12
src/utils.hh
12
src/utils.hh
|
@ -21,8 +21,8 @@ public:
|
||||||
|
|
||||||
static T& instance()
|
static T& instance()
|
||||||
{
|
{
|
||||||
kak_assert (ms_instance);
|
kak_assert(ms_instance);
|
||||||
return *ms_instance;
|
return *static_cast<T*>(ms_instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool has_instance()
|
static bool has_instance()
|
||||||
|
@ -33,8 +33,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
Singleton()
|
Singleton()
|
||||||
{
|
{
|
||||||
kak_assert(not ms_instance);
|
kak_assert(ms_instance == nullptr);
|
||||||
ms_instance = static_cast<T*>(this);
|
ms_instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
~Singleton()
|
~Singleton()
|
||||||
|
@ -44,11 +44,11 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static T* ms_instance;
|
static Singleton* ms_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T* Singleton<T>::ms_instance = nullptr;
|
Singleton<T>* Singleton<T>::ms_instance = nullptr;
|
||||||
|
|
||||||
// *** On scope end ***
|
// *** On scope end ***
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue
Block a user