From cdd8dee205290c45b28f8c00aaefe06e30d60e8f Mon Sep 17 00:00:00 2001 From: Stephen Webb Date: Fri, 2 Aug 2024 12:56:22 +1000 Subject: [PATCH 1/2] Add a diagnostic hint to input stream error --- include/boost/archive/basic_text_iprimitive.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/boost/archive/basic_text_iprimitive.hpp b/include/boost/archive/basic_text_iprimitive.hpp index 606f59f580..2546017070 100644 --- a/include/boost/archive/basic_text_iprimitive.hpp +++ b/include/boost/archive/basic_text_iprimitive.hpp @@ -26,6 +26,7 @@ #include #include // size_t +#include // itoa #include #if defined(BOOST_NO_STDC_NAMESPACE) @@ -86,10 +87,13 @@ class BOOST_SYMBOL_VISIBLE basic_text_iprimitive { template void load(T & t) { + auto pos = is.tellg(); if(is >> t) return; + static char at_offset[64] = "at offset "; + itoa(pos, &at_offset[10], 10); boost::serialization::throw_exception( - archive_exception(archive_exception::input_stream_error) + archive_exception(archive_exception::input_stream_error, at_offset) ); } From 87e19651beb09fbde0c019c8e881731bb4ef904f Mon Sep 17 00:00:00 2001 From: Stephen Webb Date: Thu, 30 Jul 2026 14:48:24 +1000 Subject: [PATCH 2/2] Use snprintf instead of itoa --- include/boost/archive/basic_text_iprimitive.hpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/include/boost/archive/basic_text_iprimitive.hpp b/include/boost/archive/basic_text_iprimitive.hpp index 2546017070..50c66f5d4a 100644 --- a/include/boost/archive/basic_text_iprimitive.hpp +++ b/include/boost/archive/basic_text_iprimitive.hpp @@ -26,7 +26,7 @@ #include #include // size_t -#include // itoa +#include // snprintf #include #if defined(BOOST_NO_STDC_NAMESPACE) @@ -90,11 +90,14 @@ class BOOST_SYMBOL_VISIBLE basic_text_iprimitive { auto pos = is.tellg(); if(is >> t) return; - static char at_offset[64] = "at offset "; - itoa(pos, &at_offset[10], 10); + char at_offset[64] = "at offset "; + if (std::streampos(-1) == pos) + snprintf&at_offset[10], 54, "%s", ""); + else + snprintf(&at_offset[10], 54, "%d", static_cast(pos)); boost::serialization::throw_exception( archive_exception(archive_exception::input_stream_error, at_offset) - ); + ); } void load(char & t)