https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82694

--- Comment #7 from amker at gcc dot gnu.org ---
I didn't go through all the differences, but below is an example of using
wrapping behavior for pointers:

int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
 unsigned long long num;
 char *str, *end;
 struct printf_spec spec = {0};
 //...
 str = buf;
 end = buf + size;

 if (end < buf) {
  end = ((void *)-1);
  size = end - buf;
 }
 //...
}
int vsprintf(char *buf, const char *fmt, va_list args)
{
 return vsnprintf(buf, ((int)(~0U>>1)), fmt, args);
}
So vsnprintf get 0x7fffffff as the second argument, the comparison between end
and buf gets folded with undefined overflow behavior assumption.

Reply via email to