Fix GCC narrowing warning and address review feedback

- get_bytes(): replace `len -= static_cast<NumberType>(wanted)` with an
  explicit `len = static_cast<NumberType>(len - ...)`. The compound
  assignment promoted the operands to int and narrowed back, which GCC
  rejects under -Werror=arith-conversion when NumberType is narrower than
  int (e.g. UBJSON's int16 length). This also fixes the CodeQL build.
- get_bytes(): add JSON_ASSERT(read == wanted) documenting that
  get_elements() never returns more than requested (per review).
- iterator_input_adapter: de-duplicate the iterator_is_contiguous
  definition with the #if inside the initializer (per review).
- Add a comment explaining why the memcpy source is &*current (needed for
  non-pointer contiguous iterators), and drop the redundant parentheses.
- Run astyle on the new unit test so the amalgamation/format check passes.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Niels Lohmann
2026-07-04 08:57:45 +02:00
co-authored by Claude Opus 4.8
parent 9eee7a7b9b
commit 282ff6ce5c
4 changed files with 26 additions and 16 deletions
@@ -2975,13 +2975,16 @@ class binary_reader
if (JSON_HEDLEY_UNLIKELY(read < wanted))
{
// premature end of input: shrink to what was actually read and
// report the failure at the first missing byte
// report the failure at the first missing byte (same position
// accounting as get_to() for partial number reads)
result.resize(old_size + read);
++chars_read;
current = char_traits<char_type>::eof();
return unexpect_eof(format, context);
}
len -= static_cast<NumberType>(wanted);
// a full chunk was read; get_elements() never returns more than requested
JSON_ASSERT(read == wanted);
len = static_cast<NumberType>(len - static_cast<NumberType>(wanted));
}
return true;
}