1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-26 04:41:34 +00:00

Merge branch 'fix_esm_fixed_string_warning' into 'master'

Fix gcc warning: array subscript n is outside array bounds of ‘const char [n]’

See merge request OpenMW/openmw!2585
This commit is contained in:
psi29a 2023-01-07 22:15:16 +00:00
commit a9d3186173
2 changed files with 188 additions and 137 deletions

View file

@ -2,6 +2,8 @@
#include "components/esm/esmcommon.hpp"
#include <gtest/gtest.h>
namespace
{
TEST(EsmFixedString, operator__eq_ne)
{
{
@ -35,6 +37,7 @@ TEST(EsmFixedString, operator__eq_ne)
EXPECT_TRUE(name == ss);
}
}
TEST(EsmFixedString, operator__eq_ne_const)
{
{
@ -141,3 +144,45 @@ TEST(EsmFixedString, construction_from_RecNameInts_is_supported)
constexpr ESM::NAME value(ESM::RecNameInts::REC_ACTI);
EXPECT_EQ(value, static_cast<std::uint32_t>(ESM::RecNameInts::REC_ACTI)) << value.toInt();
}
TEST(EsmFixedString, equality_operator_for_not_convertible_to_uint32_with_string_literal)
{
const ESM::FixedString<5> value("abcd");
EXPECT_EQ(value, "abcd");
}
TEST(EsmFixedString, equality_operator_for_not_convertible_to_uint32_with_fixed_size_char_array)
{
const ESM::FixedString<5> value("abcd");
const char other[5] = { 'a', 'b', 'c', 'd', '\0' };
EXPECT_EQ(value, other);
}
TEST(EsmFixedString, equality_operator_for_not_convertible_to_uint32_with_const_char_pointer)
{
const ESM::FixedString<5> value("abcd");
const char other[5] = { 'a', 'b', 'c', 'd', '\0' };
EXPECT_EQ(value, static_cast<const char*>(other));
}
TEST(EsmFixedString, equality_operator_for_not_convertible_to_uint32_with_string)
{
const ESM::FixedString<5> value("abcd");
EXPECT_EQ(value, std::string("abcd"));
}
TEST(EsmFixedString, equality_operator_for_not_convertible_to_uint32_with_string_view)
{
const ESM::FixedString<5> value("abcd");
const std::string other("abcd");
EXPECT_EQ(value, std::string_view(other));
}
TEST(EsmFixedString, equality_operator_should_not_get_out_of_bounds)
{
ESM::FixedString<5> value;
const char other[5] = { 'a', 'b', 'c', 'd', 'e' };
std::memcpy(value.mData, other, sizeof(other));
EXPECT_EQ(value, static_cast<const char*>(other));
}
}

View file

@ -121,23 +121,23 @@ namespace ESM
}
};
template <std::size_t capacity, class T, typename = std::enable_if_t<std::is_same_v<T, char>>>
inline bool operator==(const FixedString<capacity>& lhs, const T* const& rhs) noexcept
template <std::size_t capacity>
inline bool operator==(const FixedString<capacity>& lhs, std::string_view rhs) noexcept
{
for (std::size_t i = 0; i < capacity; ++i)
for (std::size_t i = 0, n = std::min(rhs.size(), capacity); i < n; ++i)
{
if (lhs.mData[i] != rhs[i])
return false;
if (lhs.mData[i] == '\0')
return true;
}
return rhs[capacity] == '\0';
return rhs.size() <= capacity || rhs[capacity] == '\0';
}
template <std::size_t capacity>
inline bool operator==(const FixedString<capacity>& lhs, const std::string& rhs) noexcept
template <std::size_t capacity, class T, typename = std::enable_if_t<std::is_same_v<T, char>>>
inline bool operator==(const FixedString<capacity>& lhs, const T* const& rhs) noexcept
{
return lhs == rhs.c_str();
return lhs == std::string_view(rhs, capacity);
}
template <std::size_t capacity, std::size_t rhsSize>
@ -156,6 +156,12 @@ namespace ESM
return lhs.toInt() == rhs.toInt();
}
template <class T, typename = std::enable_if_t<std::is_same_v<T, char>>>
inline bool operator==(const FixedString<4>& lhs, const T* const& rhs) noexcept
{
return lhs == std::string_view(rhs, 5);
}
template <std::size_t capacity, class Rhs>
inline bool operator!=(const FixedString<capacity>& lhs, const Rhs& rhs) noexcept
{