https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116834
Harald van Dijk <harald at gigawatt dot nl> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |harald at gigawatt dot nl --- Comment #4 from Harald van Dijk <harald at gigawatt dot nl> --- (In reply to Sam James from comment #3) > Please provide preprocessed source for the original. Not entirely preprocessed (due to using __SIZE_TYPE__ rather than its expanded version) but a self-contained compilable version of the original code from comment #2 is: typedef struct bstr { unsigned char *start; __SIZE_TYPE__ len; } bstr; __SIZE_TYPE__ talloc_get_size(const void *); void resize_append(void *, bstr *, __SIZE_TYPE__); void bstr_xappend(void *, bstr *, bstr); static inline struct bstr bstr0(const char *s) { return (struct bstr){(unsigned char *)s, s ? __builtin_strlen(s) : 0}; } void bstr_xappend_vasprintf(void *talloc_ctx, bstr *s, const char *fmt, __builtin_va_list ap) { int size; __builtin_va_list copy; __builtin_va_copy(copy, ap); __SIZE_TYPE__ avail = talloc_get_size(s->start) - s->len; char *dest = s->start ? s->start + s->len : 0; size = __builtin_vsnprintf(dest, avail, fmt, copy); __builtin_va_end(copy); if (size < 0) { bstr_xappend(talloc_ctx, s, bstr0("format error: ")); bstr_xappend(talloc_ctx, s, bstr0(fmt)); return; } if (avail < 1 || size + 1 > avail) { resize_append(talloc_ctx, s, size + 1); __builtin_vsnprintf(s->start + s->len, size + 1, fmt, ap); } s->len += size; } $ gcc-14 -fsanitize=undefined -Wformat -O2 -c bug116834.c bug116834.c: In function ‘bstr_xappend_vasprintf’: bug116834.c:23:12: warning: null format string [-Wformat-truncation=] 23 | size = __builtin_vsnprintf(dest, avail, fmt, copy); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $ gcc-14 --version gcc-14 (Ubuntu 14.2.0-4ubuntu2~24.04) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.