Ошибки сегмента часто вызваны удалением ссылки на нулевой указатель, который, в свою очередь, обычно указывает на адрес, который не является частью адресного пространства процесса.Хорошая ставка, что что-то в этом роде - ваша проблема.Как правило, кажется, что вы проделали довольно хорошую работу по проверке переменных перед их использованием, с несколькими заметными исключениями:
- При первом использовании
ctx
(если только счет argc
неверенили stat
! = 0) находится в вызове RedisModule_ReplyWithCallReply
.Следует проверить, что он не равен нулю перед использованием. - Возвращаемое значение
RedisModule_Call
не может быть проверено, когда оно вызывается в качестве аргумента для другой функции.И согласно этой документации API эта функция возвращает NULL для неправильного типа ответа.
Предложить удалить встроенный вызов для RedisModule_Call
, чтобы вы могли проверить его возвращаемое значение, прежде чем передать его в качестве аргумента RedisModule_ReplyWithCallReply()
.
RedisModuleCallReply *reply = RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, valueSize, "REPLACE");
if(!reply)
{
// handle error;
}
else
{
RedisModule_ReplyWithCallReply(ctx, reply);
}
Редактировать:
Еще одна мысль, строка:
fread(&keyValue, (size_t) info.st_size, 1, f);
^//not needed
Должно быть:
fread(keyValue, (size_t) info.st_size, 1, f);