From fd8a99acff36ae205d13ca62868b3deaa9c3d17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Sun, 8 Oct 2023 17:13:03 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20`mdbx=5Fdump=5Fval()`=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D0=BE=D0=B9=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Обеспечении терминирующего нуля даже при нехватке буфера и опосредованных предупреждений Valgrind из-за чтения внутри strlen() неинициализированных данных при последующем логировании/печати. - Ускорение за счет отказа от использования snpruintf(). --- ChangeLog.md | 1 + src/core.c | 19 ++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index b2aa1db5..74a3e027 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -46,6 +46,7 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic т.е. проверку БД в кооперативном (не эксклюзивном) режиме чтения-записи в сборках с поддержкой Valgrind или включеным ASAN. Для более подробной информации см. [соответствующий коммит](https://gitflic.ru/project/erthink/libmdbx/commit/1aead6869a7eff1a85e400ab3eeecb4c8b904fe6). + - Доработка `mdbx_dump_val()` используемой для логирования и отладки. -------------------------------------------------------------------------------- diff --git a/src/core.c b/src/core.c index b07eb4c7..cbcf5f6a 100644 --- a/src/core.c +++ b/src/core.c @@ -3634,18 +3634,15 @@ const char *mdbx_dump_val(const MDBX_val *key, char *const buf, char *const detent = buf + bufsize - 2; char *ptr = buf; *ptr++ = '<'; - for (size_t i = 0; i < key->iov_len; i++) { - const ptrdiff_t left = detent - ptr; - assert(left > 0); - int len = snprintf(ptr, left, "%02x", data[i]); - if (len < 0 || len >= left) - break; - ptr += len; - } - if (ptr < detent) { - ptr[0] = '>'; - ptr[1] = '\0'; + for (size_t i = 0; i < key->iov_len && ptr < detent; i++) { + const char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + *ptr++ = hex[data[i] >> 4]; + *ptr++ = hex[data[i] & 15]; } + if (ptr < detent) + *ptr++ = '>'; + *ptr = '\0'; } return buf; }