engine
engine copied to clipboard
Integer constant is too large for ‘long’ type
Добрый день, На CentOS 6 32-bit при установки (cmake3 --build . --target install --config Release) возникает проблема (gost_keyexpimp.c:239: error: integer constant is too large for ‘long’ type) Связана ли эта проблема с 32-bit версией ОС? Есть ли решение этой проблемы? Спасибо!
В какой ветке?
master и openssl_1_1_1
Это очень странно, потому что в строке 239 нет ничего похожего
https://github.com/gost-engine/engine/blob/874d48d88c6b69c7f2f6765b0c9bfae6585ac8e4/gost_keyexpimp.c#L239
Вот полный вывод: cmake3 --build . --target install --config Release [ 24%] Built target gost_core [ 25%] Building C object CMakeFiles/gost_engine.dir/gost_keyexpimp.c.o cc1: warnings being treated as errors /root/openssl-gost-prod/engine-58a46b289d6b8df06072fc9c0304f4b2d3f4b051/gost_keyexpimp.c: In function ‘gost_tlstree’: /root/openssl-gost-prod/engine-58a46b289d6b8df06072fc9c0304f4b2d3f4b051/gost_keyexpimp.c:239: error: integer constant is too large for ‘long’ type /root/openssl-gost-prod/engine-58a46b289d6b8df06072fc9c0304f4b2d3f4b051/gost_keyexpimp.c:240: error: integer constant is too large for ‘long’ type /root/openssl-gost-prod/engine-58a46b289d6b8df06072fc9c0304f4b2d3f4b051/gost_keyexpimp.c:241: error: integer constant is too large for ‘long’ type /root/openssl-gost-prod/engine-58a46b289d6b8df06072fc9c0304f4b2d3f4b051/gost_keyexpimp.c:242: error: integer constant is too large for ‘long’ type gmake[2]: *** [CMakeFiles/gost_engine.dir/gost_keyexpimp.c.o] Error 1 gmake[1]: *** [CMakeFiles/gost_engine.dir/all] Error 2 gmake: *** [all] Error 2
я в тупике! на x64 все прошло успешно.
Покажите пожалуйста, как у Вас выглядят строки 239-242.
uint64_t gh_c1 = 0x00000000FFFFFFFF, gh_c2 = 0x0000F8FFFFFFFFFF,
Видимо, сама константа 0x0000F8FFFFFFFFFF не влазит.
Да, но почему uint64_t
при этом считается long
?
uint64_t
тут ни при чем, речь о самой константе 0x0000F8FFFFFFFFFF
тот компилятор, видимо, решил что это long
(на моей системе это не воспроизводится). Надо дописать суффикс LL
и всё.
https://en.cppreference.com/w/c/language/integer_constant
Надо дописать суффикс
LL
и всё.
Лучше ULL
.
Покажите пожалуйста, как у Вас выглядят строки 239-242.
Добрый день, Вот как выглядит код #else uint64_t gh_c1 = 0x00000000FFFFFFFF, gh_c2 = 0x0000F8FFFFFFFFFF, gh_c3 = 0xC0FFFFFFFFFFFFFF; uint64_t mg_c1 = 0x00000000C0FFFFFF, mg_c2 = 0x000000FEFFFFFFFF, mg_c3 = 0x00F0FFFFFFFFFFFF; #endif
Как минимум, у Вас не последняя версия кода.
Сейчас использовал ветку engine-openssl_1_1_1 Вот, что получается [ 46%] Building C object CMakeFiles/gost_engine.dir/gost_keyexpimp.c.o cc1: warnings being treated as errors /root/openssl-gost-prod/engine-openssl_1_1_1/gost_keyexpimp.c: In function ‘gost_tlstree’: /root/openssl-gost-prod/engine-openssl_1_1_1/gost_keyexpimp.c:234: error: integer constant is too large for ‘long’ type /root/openssl-gost-prod/engine-openssl_1_1_1/gost_keyexpimp.c:235: error: integer constant is too large for ‘long’ type /root/openssl-gost-prod/engine-openssl_1_1_1/gost_keyexpimp.c:236: error: integer constant is too large for ‘long’ type /root/openssl-gost-prod/engine-openssl_1_1_1/gost_keyexpimp.c:237: error: integer constant is too large for ‘long’ type gmake[2]: *** [CMakeFiles/gost_engine.dir/gost_keyexpimp.c.o] Error 1 gmake[1]: *** [CMakeFiles/gost_engine.dir/all] Error 2 gmake: *** [all] Error 2
Попробуйте, как советует @vt-alt, добавить ULL к константам, чтобы обозначить их тип явным образом.
Подскажите пожалуйста как правильно добавить суффикс ULL? К сожалению я далек от программирования. Спасибо.
У Вас должно получиться что-то вроде
uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL,
gh_c3 = 0xC0FFFFFFFFFFFFFFULL;
Весь фрагмент должен выглядеть вот так:
#else
uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL,
gh_c3 = 0xC0FFFFFFFFFFFFFFULL;
uint64_t mg_c1 = 0x00000000C0FFFFFF, mg_c2 = 0x000000FEFFFFFFFFULL,
mg_c3 = 0x00F0FFFFFFFFFFFFULL;
#endif
Ошибся в прерывающем комменте -- весь фрагмент должен выглядеть вот так:
#else
uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL,
gh_c3 = 0xC0FFFFFFFFFFFFFFULL;
uint64_t mg_c1 = 0x00000000C0FFFFFFULL, mg_c2 = 0x000000FEFFFFFFFFULL,
mg_c3 = 0x00F0FFFFFFFFFFFFULL;
#endif
Сорян, "предыдущем", а не "прерывающем " - в спеллчекере нажал замену не посмотрев.
Код привел к следующему виду uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL, gh_c3 = 0xC0FFFFFFFFFFFFFFULL; uint64_t mg_c1 = 0x00000000C0FFFFFFULL, mg_c2 = 0x000000FEFFFFFFFFULL, mg_c3 = 0x00F0FFFFFFFFFFFFULL; И и все заработало! Спасибо большое за поддержку.