我使用了一些函数,这个函数返回LPWSTR类型的变量(wchar_t *)
在调试器中我看看这个变量并看到错误" 0x2e(地址0x2e越界)" 当我用变量做一些操作时,我的程序终止了。
我无法更改被调用的函数,我没有它的src代码。
我的问题是:c / c ++语言是否具有在调用错误变量之前检查情况的函数?我尝试try / catch块,但它没有帮助。
对不起我的英文,谢谢你的帮助
编辑:
错误代码片段
PCERT_EXTENSION pCe = CertFindExtension(szOID_CRL_DIST_POINTS, pCertInfo->cExtension, pCertInfo->rgExtension);
if (pCe) {
PCRL_DIST_POINTS_INFO pCrlDistPointsInfo = NULL;
PCRL_DIST_POINT *pCrlDistPointsPtr = NULL;
PCRL_DIST_POINT pCrlDistPoints = NULL;
DWORD pdwCrlDistPoints = sizeof (CRL_DIST_POINTS_INFO);
if (!CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
szOID_CRL_DIST_POINTS,
pCe->Value.pbData,
pCe->Value.cbData,
CRYPT_DECODE_ALLOC_FLAG,
(PCRYPT_DECODE_PARA) NULL,
&pCrlDistPointsInfo,
&pdwCrlDistPoints)) {
printf("\n\nCannot decode CRL URL.\n\n");
}
if (pCrlDistPointsInfo) {
pCrlDistPointsPtr = (PCRL_DIST_POINT*) pCrlDistPointsInfo->rgDistPoint;
if (pCrlDistPointsPtr && pCrlDistPointsInfo->cDistPoint > 0) {
findCDP = true;
fwprintf(pFile, L"^^");
for (int i = 0; i < pCrlDistPointsInfo->cDistPoint; i++) {
pCrlDistPoints = &pCrlDistPointsInfo->rgDistPoint[i];
if (pCrlDistPoints) {
LPWSTR str = (LPWSTR) pCrlDistPoints->DistPointName._empty_union_.FullName.rgAltEntry->_empty_union_.pwszURL;
//printf("last error= 0x%08X", GetLastError());
fwprintf(pFile, str);//PROGRAM TERMINATED HERE!!!
fwprintf(pFile, L";");
}
printf("%d\n",i);
}
}
free(pCrlDistPointsInfo);
}
}
答案 0 :(得分:4)
不,它没有。如果设置指向无效内存位置的指针,则对该位置的对象的每次访问都是未定义的行为。最有可能发生的事情是崩溃或某种内存损坏。
答案 1 :(得分:3)
如果指针的值为0x0000002e
,则只能表示两件事:
另一方面,0x2e听起来像ASCII字符,确切地说是'.'
,所以你确定你看的是指针值而不是指向的字符串吗?
延迟编辑:查看代码,似乎工会参与其中。崩溃的一个可能原因是,你正在访问错误的工会成员。在C union中,所有成员/字段都在相同的内存位置,它们重叠。换句话说,union一次只能保存一个值,你需要以某种方式知道哪个值,例如从初始化union值的函数文档,或者通过一些告诉类型的额外变量(C中的常见模式是拥有包含类型字段和联合字段的结构。)
答案 2 :(得分:1)
Windows具有检查地址是否正确的功能。但是......依靠这个是不好的做法,因为无法保证如果指针指向正确的地址,那么这就是你想要的地址。
Windows中的函数是:IsBadReadPtr,IsBadWritePtr和IsBadCodePtr。我强烈建议只在调试代码中使用这些函数(例如断言),并且永远不要在发布可执行文件中依赖它。
如果您的应用程序设计正常并且工作正常,则不应依赖这些Windows功能。