mirror of
https://github.com/neovim/neovim.git
synced 2025-09-18 17:28:23 +00:00
strings: Fix “unexpected format specifier: %lp” ASAN error
This commit is contained in:
@@ -1083,26 +1083,20 @@ int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
|
|||||||
// when zero value is formatted with an explicit precision 0,
|
// when zero value is formatted with an explicit precision 0,
|
||||||
// resulting formatted string is empty (d, i, u, b, B, o, x, X, p)
|
// resulting formatted string is empty (d, i, u, b, B, o, x, X, p)
|
||||||
} else {
|
} else {
|
||||||
// construct a simple format string for snprintf
|
|
||||||
char f[] = "%" PRIdMAX;
|
|
||||||
f[sizeof("%" PRIdMAX) - 1 - 1] = fmt_spec;
|
|
||||||
|
|
||||||
switch (fmt_spec) {
|
switch (fmt_spec) {
|
||||||
case 'p': {
|
case 'p': { // pointer
|
||||||
str_arg_l += (size_t)snprintf(tmp + str_arg_l,
|
str_arg_l += (size_t)snprintf(tmp + str_arg_l,
|
||||||
sizeof(tmp) - str_arg_l,
|
sizeof(tmp) - str_arg_l,
|
||||||
f, ptr_arg);
|
"%p", ptr_arg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'd': {
|
case 'd': { // signed
|
||||||
// signed
|
|
||||||
str_arg_l += (size_t)snprintf(tmp + str_arg_l,
|
str_arg_l += (size_t)snprintf(tmp + str_arg_l,
|
||||||
sizeof(tmp) - str_arg_l,
|
sizeof(tmp) - str_arg_l,
|
||||||
f, arg);
|
"%" PRIdMAX, arg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'b': case 'B': {
|
case 'b': case 'B': { // binary
|
||||||
// binary
|
|
||||||
size_t bits = 0;
|
size_t bits = 0;
|
||||||
for (bits = sizeof(uintmax_t) * 8; bits > 0; bits--) {
|
for (bits = sizeof(uintmax_t) * 8; bits > 0; bits--) {
|
||||||
if ((uarg >> (bits - 1)) & 0x1) {
|
if ((uarg >> (bits - 1)) & 0x1) {
|
||||||
@@ -1115,8 +1109,11 @@ int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: { // unsigned
|
||||||
// unsigned
|
// construct a simple format string for snprintf
|
||||||
|
char f[] = "%" PRIuMAX;
|
||||||
|
f[sizeof("%" PRIuMAX) - 1 - 1] = fmt_spec;
|
||||||
|
assert(PRIuMAX[sizeof(PRIuMAX) - 1 - 1] == 'u');
|
||||||
str_arg_l += (size_t)snprintf(tmp + str_arg_l,
|
str_arg_l += (size_t)snprintf(tmp + str_arg_l,
|
||||||
sizeof(tmp) - str_arg_l,
|
sizeof(tmp) - str_arg_l,
|
||||||
f, uarg);
|
f, uarg);
|
||||||
|
Reference in New Issue
Block a user