engine icon indicating copy to clipboard operation
engine copied to clipboard

Integer constant is too large for ‘long’ type

Open dvbalabanov opened this issue 3 years ago • 19 comments

Добрый день, На 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 версией ОС? Есть ли решение этой проблемы? Спасибо!

dvbalabanov avatar Oct 20 '20 15:10 dvbalabanov

В какой ветке?

beldmit avatar Oct 20 '20 17:10 beldmit

master и openssl_1_1_1

dvbalabanov avatar Oct 20 '20 18:10 dvbalabanov

Это очень странно, потому что в строке 239 нет ничего похожего

https://github.com/gost-engine/engine/blob/874d48d88c6b69c7f2f6765b0c9bfae6585ac8e4/gost_keyexpimp.c#L239

beldmit avatar Oct 20 '20 19:10 beldmit

Вот полный вывод: 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 все прошло успешно.

dvbalabanov avatar Oct 20 '20 19:10 dvbalabanov

Покажите пожалуйста, как у Вас выглядят строки 239-242.

beldmit avatar Oct 20 '20 19:10 beldmit

    uint64_t gh_c1 = 0x00000000FFFFFFFF, gh_c2 = 0x0000F8FFFFFFFFFF,

Видимо, сама константа 0x0000F8FFFFFFFFFF не влазит.

vt-alt avatar Oct 20 '20 19:10 vt-alt

Да, но почему uint64_t при этом считается long?

beldmit avatar Oct 20 '20 19:10 beldmit

uint64_t тут ни при чем, речь о самой константе 0x0000F8FFFFFFFFFF тот компилятор, видимо, решил что это long (на моей системе это не воспроизводится). Надо дописать суффикс LL и всё.

https://en.cppreference.com/w/c/language/integer_constant

vt-alt avatar Oct 20 '20 20:10 vt-alt

Надо дописать суффикс LL и всё.

Лучше ULL.

vt-alt avatar Oct 20 '20 20:10 vt-alt

Покажите пожалуйста, как у Вас выглядят строки 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

dvbalabanov avatar Oct 21 '20 07:10 dvbalabanov

Как минимум, у Вас не последняя версия кода.

beldmit avatar Oct 21 '20 07:10 beldmit

Сейчас использовал ветку 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

dvbalabanov avatar Oct 21 '20 07:10 dvbalabanov

Попробуйте, как советует @vt-alt, добавить ULL к константам, чтобы обозначить их тип явным образом.

beldmit avatar Oct 21 '20 07:10 beldmit

Подскажите пожалуйста как правильно добавить суффикс ULL? К сожалению я далек от программирования. Спасибо.

dvbalabanov avatar Oct 21 '20 08:10 dvbalabanov

У Вас должно получиться что-то вроде

uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL,
gh_c3 = 0xC0FFFFFFFFFFFFFFULL;

beldmit avatar Oct 21 '20 08:10 beldmit

Весь фрагмент должен выглядеть вот так:

#else
uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL,
 gh_c3 = 0xC0FFFFFFFFFFFFFFULL;
uint64_t mg_c1 = 0x00000000C0FFFFFF, mg_c2 = 0x000000FEFFFFFFFFULL,
 mg_c3 = 0x00F0FFFFFFFFFFFFULL;
#endif

vt-alt avatar Oct 21 '20 16:10 vt-alt

Ошибся в прерывающем комменте -- весь фрагмент должен выглядеть вот так:

#else
uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL,
 gh_c3 = 0xC0FFFFFFFFFFFFFFULL;
uint64_t mg_c1 = 0x00000000C0FFFFFFULL, mg_c2 = 0x000000FEFFFFFFFFULL,
 mg_c3 = 0x00F0FFFFFFFFFFFFULL;
#endif

vt-alt avatar Oct 21 '20 16:10 vt-alt

Сорян, "предыдущем", а не "прерывающем " - в спеллчекере нажал замену не посмотрев.

vt-alt avatar Oct 21 '20 16:10 vt-alt

Код привел к следующему виду uint64_t gh_c1 = 0x00000000FFFFFFFFULL, gh_c2 = 0x0000F8FFFFFFFFFFULL, gh_c3 = 0xC0FFFFFFFFFFFFFFULL; uint64_t mg_c1 = 0x00000000C0FFFFFFULL, mg_c2 = 0x000000FEFFFFFFFFULL, mg_c3 = 0x00F0FFFFFFFFFFFFULL; И и все заработало! Спасибо большое за поддержку.

dvbalabanov avatar Oct 22 '20 14:10 dvbalabanov