Crypto++导致应用程序失败
Crypto++ causing application failure
我正在开发Crypto++的Flash的AIR本地扩展,我将作为公共领域发布。我开始用一些代码来测试哈希(在这种情况下使用SHA-256),但由于某种原因CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
(通过消除过程发现)导致Flash编译器不识别任何可用的方法(扩展上下文没有名为isSupported的方法):
下面是完整的c++代码:
FREObject isSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
FREObject result;
uint32_t isSupportedSwitch = 1;
FRENewObjectFromBool(isSupportedSwitch, &result);
return result;
}
FREObject computeHash(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
FREObject result;
FREByteArray actualBytes;
FREAcquireByteArray(argv[0], &actualBytes);
byte const* pbData = (byte*) actualBytes.bytes;
unsigned int nDataLen = strlen((const char*) pbData);
byte abDigest[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
memcpy(actualBytes.bytes, (uint8_t*) abDigest, 32);
FREReleaseByteArray(argv[0]);
FRENewObjectFromBool(1, &result);
return result;
}
void testContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
{
*numFunctions = 2;
FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));
func[0].name = (const uint8_t*) "isSupported";
func[0].functionData = NULL;
func[0].function = &isSupported;
func[1].name = (const uint8_t*) "computeHash";
func[1].functionData = NULL;
func[1].function = &computeHash;
*functions = func;
}
void testContextFinalizer(FREContext ctx)
{
return;
}
void testInitializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
{
*ctxInitializer = &testContextInitializer;
*ctxFinalizer = &testContextFinalizer;
}
void testFinalizer(void* extData)
{
return;
}
如果有任何帮助,我将不胜感激,并将在这个项目中帮助我。
编辑:为了澄清,我想问为什么CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
会导致上面提到的应用程序失败以及修复它的可能方法。
看起来您假设actualBytes。Bytes是指向至少32字节的内存块的指针,因为您已经将32硬编码为memcpy中的第三个参数。
这可能是一个无效的假设,您应该检查以确保actualBytes。长度>= 32,然后执行memcpy
最安全的方法可能是确保从ActionScript端分配了足够大的内存块。或者,您可以尝试在c++中分配内存,然后修改actualBytes内容以指向该分配并更改长度值。但这似乎充满了危险。
相关文章:
- C++ 错误的分配应用程序失败
- MXE Qt5 应用程序构建在 Docker 容器中失败
- 程序'main.exe'运行失败:指定的可执行文件不是此操作系统平台的有效应用程序
- 基于CMAKE的CUDA应用程序的构建失败 - 没有传递给链接器的文件
- 如果应用程序从安装选项启动,则加载库失败,错误代码为 126
- 添加新对话框后,MFC 应用程序启动失败并"DLL Initialization Failed"
- 使用Outlook 2016:MAPISendMail在Windows应用程序中失败,并返回"MAPI_E_FAILURE"作为错误代码
- 当在64箱计算机中使用32个bin应用程序时,terminateProcess()失败
- LoadLibrary失败带有错误4250:此操作仅在应用程序容器的上下文中有效
- .Net应用程序SideBySide加载失败COMException(0x80040154)
- libcurl错误失败的写作已接收到磁盘/应用程序的数据
- MFC功能区接口在本地化应用程序时发出断言失败
- 什么可能导致应用程序在工作几个小时后锁定获取 SIGABRT 失败
- 从注入的dll调用BeginPaint时失败,即使在目标应用程序中调用了EndPaint之后也是如此
- SQL SP在SSMS中正常工作,但在VC++应用程序中失败
- 在应用程序中检查互联网连接C++可靠方法:gethostbyname() 失败
- 在QT框架中编译比特币-QT应用程序时断言失败错误
- 从 IIS 7.5 Web 应用程序调用 Win32 CreateEvent() 失败
- Tizen 应用程序启动失败
- JNI_CreateJavaVM() 每隔一次运行应用程序时都会失败(确切地说)