GMP MPZ_IMPORT вызывает SIGFPE во время десериализации сериализованного массива MPZ_T (макет буфера кажется действительнC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 GMP MPZ_IMPORT вызывает SIGFPE во время десериализации сериализованного массива MPZ_T (макет буфера кажется действительн

Сообщение Anonymous »

Я реализую безопасную многопартийную систему в C ++ и Node.js. I сериализовать сложную структуру (называемую MSK ), содержащую множество полей MPZ_T с использованием MPZ_EXPORT и реконструировать его с помощью mpz_import .
Однако, хотя длина буфера является правильной, а выход MPZ_EXPORT и MPZ_IMPORT , кажется, на наиболее полезных, Is Fields, Is Fieldds, Is Fieldds, It Fieldds, Is Fieldds, It Fieldds, Is Fieldds, It Fieldds, It Fieldds, It Fieldds, It Fieldds. sigfpe (исключение с плавающей запятой) при попытке десериализировать массив v внутри msk .
🔧 среда
  • os: linux (WSL2 Ubuntu)
    />
  • node.js: 64-bit
  • C ++ использует библиотеку GMP
  • JavaScript общается с C ++ через Node-ffi-napi

    /> Я использую mpz_export и mpz_import с этими параметрами:

Код: Выделить всё

// export
mpz_export(buffer + offset, &len, 1, 1, 1, 0, mpz_value);
// import
mpz_import(mpz_value, len, 1, 1, 1, 0, data + offset);
< /code>
 📦 Структура сериализации < /h3>
В c ++ я хранят сериализованные данные в этом порядке: < /p>
[list]
[*] idOfDO
, idofserver : одиночный mpz_t

[*]

Код: Выделить всё

userList[]: massiv mpz_t  

 polynomial[]
: массив пар mpz_t

[*]

Код: Выделить всё

xList[]: massiv mpz_t  

 alpha[]: massiv mpz_t  

 U[]
: 2D Матрица, сглаженная до mpz_t []

[*] : 2D Матрица, сглаженная до mpz_t []

[/list]
Каждый mpz_t сохраняется с помощью:
  • Сначала написано.)
  • Тогда mpz_export его двоичных данных
Во время десериализации я делаю:

Код: Выделить всё

size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(V[i], len, 1, 1, 1, 0, data + offset);
offset += len;
✅ Информация отладки

[*] Все поля до v [] deserialize правильно. />
[*] MPZ_IMPORT Call для v [0] вызывает sigfpe .

[*] подтверждено, что Len является неэлезом и в пределах границ перед вызовом mpz_import . /> должным образом распределяется с использованием mpz_init () перед импортом.

[*]

Код: Выделить всё

k = 2< /code> на протяжении всей сериализации и десериализации (проверяется через журналы). < /p>
< /li>
  Общий размер буфера и размеры сегментов согласован. LEN 
является ненулевым и внутри буфера Bounds.

[*] Обеспеченное буфер не усекается во время node.js base64 Encode/decode.

[*] Код-код order код. (например, с использованием order = -1 ).

[*] Заменил по умолчанию mpz_import (..., 1, 1, 1, 0, ...) с другими комбинациями -та же ошибка. size. < /p>
< /li>
< /ul>

❓ Что я подозреваю < /h3>

, возможно, выравнивание между mpz_export < /code> и mpz_import < /code>? V [] буфер запускается по неверному адресу из -за смещения после u [] ?

Может ли быть переполнение или memcpy Ошибка смещения? Data + Offset) < /code> Для всех значений? < /p>
< /li>
< /ul>

🧩 мой вопрос < /h3>

при каких терзах может быть Mpz_import < /code>, что Sigfpe < /code>? mpz_export /

Код: Выделить всё

mpz_import
Несоответствие тихо терпение терпит неудачу и приводит к FPE в GMP?

Есть ли лучшие практики для сериализации/десериализации массивов mpz_t между языками? V [] :
memcpy(&V_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < (k+1)*(k+1); i++) {
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(V, len, 1, 1, 1, 0, data + offset); // 💥 crashes here
offset += len;
}
< /code>
#include
#include
#include

struct MSK {
mpz_t idOfDO, idOfServer;
mpz_t userList[2];
mpz_t xList[2];
int l = 2;
int t = 2;

MSK() {
mpz_init(idOfDO); mpz_init(idOfServer);
for (int i = 0; i < l; i++) mpz_init(userList);
for (int i = 0; i < t; i++) mpz_init(xList);
}
~MSK() {
mpz_clear(idOfDO); mpz_clear(idOfServer);
for (int i = 0; i < l; i++) mpz_clear(userList);
for (int i = 0; i < t; i++) mpz_clear(xList);
}

unsigned char* getMSK(size_t *size) {
size_t idOfDO_len=0, idOfServer_len=0, userList_len=0, xList_len=0;

mpz_export(NULL, &idOfDO_len, 1, 1, 1, 0, idOfDO);
mpz_export(NULL, &idOfServer_len, 1, 1, 1, 0, idOfServer);
for (int i = 0; i < l; i++) {
size_t len=0;
mpz_export(NULL, &len, 1, 1, 1, 0, userList);
userList_len += len + sizeof(size_t);
}
for (int i = 0; i < t; i++) {
size_t len=0;
mpz_export(NULL, &len, 1, 1, 1, 0, xList);
xList_len += len + sizeof(size_t);
}

size_t total_len = sizeof(size_t)*6 + idOfDO_len + idOfServer_len + userList_len + xList_len;
*size = total_len;
unsigned char *buffer = (unsigned char*)malloc(total_len);
size_t offset = 0;

memcpy(buffer + offset, &idOfDO_len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, idOfDO);
offset += idOfDO_len;

memcpy(buffer + offset, &idOfServer_len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, idOfServer);
offset += idOfServer_len;

memcpy(buffer + offset, &userList_len, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < l; i++) {
size_t len = 0;
mpz_export(NULL, &len, 1, 1, 1, 0, userList);
memcpy(buffer + offset, &len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, userList);
offset += len;
}

memcpy(buffer + offset, &xList_len, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < t; i++) {
size_t len = 0;
mpz_export(NULL, &len, 1, 1, 1, 0, xList);
memcpy(buffer + offset, &len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, xList[i]);
offset += len;
}

return buffer;
}

void setMSK(unsigned char *data) {
size_t offset = 0;
size_t idOfDO_len=0, idOfServer_len=0, userList_len=0, xList_len=0;

memcpy(&idOfDO_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(idOfDO, idOfDO_len, 1, 1, 1, 0, data + offset);
offset += idOfDO_len;

memcpy(&idOfServer_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(idOfServer, idOfServer_len, 1, 1, 1, 0, data + offset);
offset += idOfServer_len;

memcpy(&userList_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < l; i++) {
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(userList[i], len, 1, 1, 1, 0, data + offset);
offset += len;
}

memcpy(&xList_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < t; i++) {
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(xList[i], len, 1, 1, 1, 0, data + offset);
offset += len;
}
}
< /code>
};

Подробнее здесь: https://stackoverflow.com/questions/796 ... -t-array-b
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»