https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68737
--- Comment #25 from dave.anglin at bell dot net --- On 2018-09-05 8:07 a.m., redi at gcc dot gnu.org wrote: > Another option is to simply define _GLIBCXX_BROKEN_VSNPRINTF in > config/os/hpux/os_defines.h and then force the use of vsprintf, which is > always > called with a large enough buffer: > > diff --git a/libstdc++-v3/config/locale/generic/c_locale.h > b/libstdc++-v3/config/locale/generic/c_locale.h > index 0d208166063..3045931c840 100644 > --- a/libstdc++-v3/config/locale/generic/c_locale.h > +++ b/libstdc++-v3/config/locale/generic/c_locale.h > @@ -70,7 +70,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > __builtin_va_list __args; > __builtin_va_start(__args, __fmt); > > -#if _GLIBCXX_USE_C99_STDIO > +#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF > const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); > #else > const int __ret = __builtin_vsprintf(__out, __fmt, __args); > diff --git a/libstdc++-v3/config/os/hpux/os_defines.h > b/libstdc++-v3/config/os/hpux/os_defines.h > index 1003477fe35..5a9c4faf75d 100644 > --- a/libstdc++-v3/config/os/hpux/os_defines.h > +++ b/libstdc++-v3/config/os/hpux/os_defines.h > @@ -109,4 +109,9 @@ typedef long int __padding_type; > #if defined (__hppa__) > #define _GLIBCXX_HAVE_BROKEN_STRTOLD 1 > #endif > + > +// The vnsprintf function returns -1 when the buffer is too small. > +// See PR libstdc++/68737. > +#define _GLIBCXX_HAVE_BROKEN_VSNPRINTF 1 > + > #endif > diff --git a/libstdc++-v3/include/bits/locale_facets.tcc > b/libstdc++-v3/include/bits/locale_facets.tcc > index 39da5766075..d5fa91e97d6 100644 > --- a/libstdc++-v3/include/bits/locale_facets.tcc > +++ b/libstdc++-v3/include/bits/locale_facets.tcc > @@ -992,7 +992,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL > char __fbuf[16]; > __num_base::_S_format_float(__io, __fbuf, __mod); > > -#if _GLIBCXX_USE_C99_STDIO > +#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF > // Precision is always used except for hexfloat format. > const bool __use_prec = > (__io.flags() & ios_base::floatfield) != ios_base::floatfield; The above fix is okay for now. Dave