c++检查变量以寻址越界

c++ check variable to address out of bounds

本文关键字:寻址 越界 变量 检查 c++      更新时间:2023-10-16

我使用了一些函数,这个函数返回LPWSTR类型(wchar_t*)的变量

在调试器中,我查看这个变量并看到错误"0x2e(地址0x2e越界)"当我对它的变量进行一些操作时,我的程序终止了。

我不能更改被调用的函数,我没有它的src代码。

我的问题是:在调用不正确的变量之前,c/c++语言是否有检查情况的功能?我试着去尝试/抓住盖帽,但无济于事。

对不起我的英语,谢谢的帮助

编辑:

带有错误的代码片段

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("nnCannot decode CRL URL.nn");
}
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("%dn",i);
}
}
free(pCrlDistPointsInfo);
}
}

不,它没有。如果设置了指向无效内存位置的指针,则对该位置的对象的每次访问都是未定义的行为。最有可能发生的是崩溃或某种内存损坏。

如果指针的值为0x0000002e,则它只能表示两件事:

  • 返回该错误的代码。如果你不能解决这个问题,那你就倒霉了
  • 未定义的指针值和错误原因会以其他方式返回,例如通过修改引用参数。但在我的书中,返回未定义的值而不是空指针仍然是一个错误

另一方面,0x2e听起来像ASCII字符,确切地说是'.',所以你确定你看到的是指针值而不是指向的字符串吗?

后期编辑:从法规来看,工会似乎也参与其中。崩溃的一个可能原因是,您访问了错误的工会成员。在C并集中,所有成员/字段都在同一内存位置,它们重叠。换句话说,并集一次只能容纳一个值,并且您需要以某种方式知道是哪一个,例如从初始化并集值的函数的文档中,或者通过某些额外的变量告诉类型(C中的常见模式是具有包含类型字段和并集字段的结构)。

Windows具有检查地址是否正确的功能。但是。。。依赖它是不好的做法,因为不能保证如果指针指向正确的地址,这就是您想要的地址。

windows中的函数有:IsBadReadPtr、IsBadWritePtr和IsBadCodePtr。我强烈建议只在调试代码中使用这些函数(例如断言),而不要在发布可执行文件中依赖这些函数。

如果你的应用程序设计和工作正确,你永远不应该依赖这些Windows功能。