mirror of
https://github.com/isar/libmdbx.git
synced 2025-12-16 17:12:23 +08:00
mdbx: изменение log_if_error() ради устранения ложных "may be used uninitialized" предупреждений в LTO-сборках.
При включении LTO анализатор путей выполнения внутри GCC начинает укачивать из-за выражений вида `return LOG_IFERR(MDBX_EINVAL);`
Проблема в том, что несмотря на __builtin_assume() и __builtin_unreachable(), комплятор не хочет
видеть что функция log_if_error() всегда возвращает получаемое значение. А если допустить что значение
будет изменено, то вместо ошибки может быть MDBX_SUCCESS, и тогда в вызывающем как-бы может произойти
обращение к неинициализированным данным, что и беспокоит компилятор.
Например, при сборке mdbx_load:
‘txn_info.txn_space_dirty’ may be used uninitialized [-Wmaybe-uninitialized]
Проэтому проще пойти анализатору навстречу и упростить исходный код.
Теперь код ошибки явно пробрасывается через тело inline-функции, но это
требует 1-2 дополнительных процессорных инструкции на каждое применение
макроса LOG_IFERROR.
Также здесь откатывается коммит 81a8127084.
This commit is contained in:
@@ -6,8 +6,8 @@
|
||||
__cold int mdbx_dbi_dupsort_depthmask(const MDBX_txn *txn, MDBX_dbi dbi, uint32_t *mask) {
|
||||
if (unlikely(!mask))
|
||||
return LOG_IFERR(MDBX_EINVAL);
|
||||
|
||||
*mask = 0;
|
||||
|
||||
int rc = check_txn(txn, MDBX_TXN_BLOCKED);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return LOG_IFERR(rc);
|
||||
@@ -16,6 +16,7 @@ __cold int mdbx_dbi_dupsort_depthmask(const MDBX_txn *txn, MDBX_dbi dbi, uint32_
|
||||
rc = cursor_init(&cx.outer, txn, dbi);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return LOG_IFERR(rc);
|
||||
|
||||
if ((cx.outer.tree->flags & MDBX_DUPSORT) == 0)
|
||||
return MDBX_RESULT_TRUE;
|
||||
|
||||
@@ -50,15 +51,15 @@ __cold int mdbx_dbi_dupsort_depthmask(const MDBX_txn *txn, MDBX_dbi dbi, uint32_
|
||||
}
|
||||
|
||||
int mdbx_canary_get(const MDBX_txn *txn, MDBX_canary *canary) {
|
||||
if (unlikely(canary == nullptr))
|
||||
return LOG_IFERR(MDBX_EINVAL);
|
||||
|
||||
int rc = check_txn(txn, MDBX_TXN_BLOCKED);
|
||||
if (unlikely(rc != MDBX_SUCCESS)) {
|
||||
memset(canary, 0, sizeof(*canary));
|
||||
return LOG_IFERR(rc);
|
||||
}
|
||||
|
||||
if (unlikely(canary == nullptr))
|
||||
return LOG_IFERR(MDBX_EINVAL);
|
||||
|
||||
*canary = txn->canary;
|
||||
return MDBX_SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user