From 567cedcc5f99aae2db9c7f124b7f3a6f4b5ec57d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 22 Feb 2021 22:09:15 -0700 Subject: [PATCH] Narrow down cast operators on IntType Say for USHORT, we were implementing casts from and to unsigned. With this change, we cast from and to uint16_t only. This allows compiler more opportunities to catch possible narrowing issues in the code. It needed a couple of fixes in the codebase though, because previously, if a USHORT was participating in arithmetic with signed numbers, eg. "u + 1", the result would have been unsigned. With this change, it would be signed. The correct fix is to update the code to read "u + 1u". That said, I think about conditionally adding back the cast out to signed/unsigned, to facilitate better type deduction. But I couldn't think of a real situation where that would help with anything. So I didn't add. Here's what it was: template , hb_enable_if (sizeof (Type) < sizeof (Type2))> operator hb_type_identity_t () const { return v; } https://github.com/harfbuzz/harfbuzz/pull/2875 --- src/hb-aat-layout-common.hh | 4 ++-- src/hb-aat-layout-morx-table.hh | 4 ++-- src/hb-open-type.hh | 9 ++++----- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 3e83673c8..d8223dc8e 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -576,7 +576,7 @@ struct StateTable if (unlikely (stop > states)) return_trace (false); for (const HBUSHORT *p = states; stop < p; p--) - num_entries = hb_max (num_entries, *(p - 1) + 1); + num_entries = hb_max (num_entries, *(p - 1) + 1u); state_neg = min_state; } } @@ -597,7 +597,7 @@ struct StateTable if (unlikely (stop < states)) return_trace (false); for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++) - num_entries = hb_max (num_entries, *p + 1); + num_entries = hb_max (num_entries, *p + 1u); state_pos = max_state + 1; } } diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 04027a61b..cf6766b04 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -337,9 +337,9 @@ struct ContextualSubtable const EntryData &data = entries[i].data; if (data.markIndex != 0xFFFF) - num_lookups = hb_max (num_lookups, 1 + data.markIndex); + num_lookups = hb_max (num_lookups, 1u + data.markIndex); if (data.currentIndex != 0xFFFF) - num_lookups = hb_max (num_lookups, 1 + data.currentIndex); + num_lookups = hb_max (num_lookups, 1u + data.currentIndex); } return_trace (substitutionTables.sanitize (c, this, num_lookups)); diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 067107965..1af4e6e64 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -54,16 +54,15 @@ namespace OT { /* Integer types in big-endian order and no alignment requirement */ template > + unsigned int Size = sizeof (Type)> struct IntType { typedef Type type; IntType () = default; - explicit constexpr IntType (Wide V) : v {V} {} - IntType& operator = (Wide i) { v = i; return *this; } - operator Wide () const { return v; } + explicit constexpr IntType (Type V) : v {V} {} + IntType& operator = (Type i) { v = i; return *this; } + operator Type () const { return v; } bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; } bool operator != (const IntType &o) const { return !(*this == o); }