Статус: Новичок
Группы: Участники
Зарегистрирован: 09.09.2019(UTC) Сообщений: 5
|
Добрый день, код, использующий CAPILite, не собирается под MacOS 10.13, clang++ (x86_64) - возникают ошибки - константы NTE_BAD_KEYSET, CRYPT_E_NO_KEY_PROPERTY, NTE_KEYSET_NOT_DEF и прочие не влезают в тип DWORD. Код:
DWORD lastError = GetLastError();
switch(lastError)
{
case NTE_BAD_KEYSET:
m_sLastError = QObject::tr("Ключевой контейнер не был открыт или не существует");
break;
case CRYPT_E_NO_KEY_PROPERTY:
m_sLastError = QObject::tr("Не найдено закрытого ключа соответствующего выбранному сертификату");
break;
case 2148532334:
m_sLastError = QObject::tr("Действие было отменено пользователем");
break;
case NTE_KEYSET_NOT_DEF:
m_sLastError = QObject::tr("Ключевой контейнер, не существует.");
break;
default:
m_sLastError = QObject::tr("Ошибка при инициализации криптографии");
}
Вывод компилятора: Код:
../../client/src/cryptplugin.cpp:2726:14: error: case value evaluates to -2146893802, which cannot be narrowed to type 'unsigned int' [-Wc++11-narrowing]
case NTE_BAD_KEYSET:
^
/opt/cprocsp/include/cpcsp/CSP_WinError.h:18204:42: note: expanded from macro 'NTE_BAD_KEYSET'
#define NTE_BAD_KEYSET _HRESULT_TYPEDEF_(0x80090016L)
^
/opt/cprocsp/include/cpcsp/CSP_WinError.h:14116:32: note: expanded from macro '_HRESULT_TYPEDEF_'
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)
В Windows Код:typedef unsigned long DWORD, *PDWORD, *LPDWORD;
В CSP_WinDef.h из ru.cryptopro.csp-5.0.11455.dmg Код:typedef unsigned int DWORD; /* XXXX icc говорит, что с этим типом есть проблемы ???? */
Очевидно, icc прав, проблемы есть :) Я верно понимаю, если я руками в header'е заменю объявление типа, то приложение рухнет, пытаясь работать с библиотекой, которая собрана с DWORD другого размера? Теперь только ждать новой сборки КриптоПро под MacOS?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Добрый день. Если что я не сотрудник КриптоПро. Сам по себе размер переменной вроде бы совпадает иначе не оттранслировалось бы 0x80090016L в -2146893802, то есть с размером проблемы нет и приложение не рухнет. Полагаю проблема скорее в том, что DWORD беззнаковый тип (unsigned, то есть отрицательные значения невозможны), а на case почему-то NTE_BAD_KEYSET как знаковый тип (signed, отрицательное значение -2146893802), поэтому наверно надо _HRESULT_TYPEDEF_ исправить на беззнаковый тип (на DWORD) вместо HRESULT (который похоже "внезапно" знаковый на Маке?) или исправить сам HRESULT словом unsigned. Другой вопрос, что если где-то в приложении сравнивается HRESULT с отрицательным значением, то там возникнет эта же проблема несовпадения диапазонов. Отредактировано пользователем 18 сентября 2019 г. 8:13:04(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 12.10.2009(UTC) Сообщений: 42
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 6 раз в 6 постах
|
Автор: two_oceans вместо HRESULT (который похоже "внезапно" знаковый на Маке?) Внезапно, на платформе Windows HRESULT тоже знаковый. Автор: Антон Шмидт Добрый день, код, использующий CAPILite, не собирается под MacOS 10.13, clang++ (x86_64) - возникают ошибки - константы NTE_BAD_KEYSET, CRYPT_E_NO_KEY_PROPERTY, NTE_KEYSET_NOT_DEF и прочие не влезают в тип DWORD.
Конечно, не влезают. Один тип знаковый, другой - нет. Лечится достаточно просто, если x86/x64 и одинаковое количество бит Код:
switch((HRESULT)lastError)) //если в case все HRESULT'ы
или наоборот Отредактировано пользователем 18 сентября 2019 г. 14:33:43(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.09.2019(UTC) Сообщений: 5
|
Спасибо за помощь. При сборке под Unix (gcc 7.4.0) таких проблем не возникало, а с инструментами под MacOS пока еще не освоился :)
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 12.10.2009(UTC) Сообщений: 42
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 6 раз в 6 постах
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close