Я реализую безопасную многопартийную систему в 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 с этими параметрами:
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 /
Несоответствие тихо терпение терпит неудачу и приводит к 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);
}
Я реализую безопасную многопартийную систему в 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. [b] sigfpe (исключение с плавающей запятой) [/b] при попытке десериализировать массив v внутри msk . 🔧 среда [list] [*] os: linux (WSL2 Ubuntu) />[*] node.js: 64-bit
[*] C ++ использует библиотеку GMP
[*] JavaScript общается с C ++ через Node-ffi-napi
/> Я использую mpz_export и mpz_import с этими параметрами:
[/list] [code]// 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[/code], idofserver : одиночный mpz_t
[*] [code]userList[]: massiv mpz_t
polynomial[][/code]: массив пар mpz_t
[*] [code]xList[]: massiv mpz_t
alpha[]: massiv mpz_t
U[][/code]: 2D Матрица, сглаженная до mpz_t []
[*] [code]V[][/code]: 2D Матрица, сглаженная до mpz_t []
[/list] Каждый mpz_t сохраняется с помощью: [list] [*] Сначала написано.[code]size_t[/code])
[*] Тогда mpz_export его двоичных данных
[/list] Во время десериализации я делаю: [code]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; [/code] ✅ Информация отладки
[*] Все поля до v [] deserialize правильно. /> [*] MPZ_IMPORT Call для v [0] вызывает sigfpe .
[*] подтверждено, что Len является неэлезом и в пределах границ перед вызовом mpz_import . /> [code]V[/code] должным образом распределяется с использованием mpz_init () перед импортом.
[*] [code]k = 2< /code> на протяжении всей сериализации и десериализации (проверяется через журналы). < /p> < /li> Общий размер буфера и размеры сегментов согласован. LEN [/code] является ненулевым и внутри буфера 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 /[code]mpz_import[/code] Несоответствие тихо терпение терпит неудачу и приводит к 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[i], 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[i]); for (int i = 0; i < t; i++) mpz_init(xList[i]); } ~MSK() { mpz_clear(idOfDO); mpz_clear(idOfServer); for (int i = 0; i < l; i++) mpz_clear(userList[i]); for (int i = 0; i < t; i++) mpz_clear(xList[i]); }