【问题标题】:c++ check variable to address out of boundsc ++检查变量以解决越界问题
【发布时间】:2012-12-17 08:10:42
【问题描述】:

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

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

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

我的问题是: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("\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);
        }
    }

【问题讨论】:

  • 这在你的问题中是什么意思,什么错误:在调试器中我查看这个变量并看到错误“0x2e”
  • 这个函数的文档对返回值有什么说法?
  • 它可能是使用低地址作为错误代码。阅读文档。
  • 地址 0x2e 越界,标签中未显示值,我已修复
  • 正确的方法是调试各个函数中的值被错误修改为error "0x2e (Address 0x2e out of bounds)"的原因。可以修改此变量的所有方式以及修改它的人,而不是在函数调用之前检查不正确的值。

标签: c++ c memory certificate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 查看我的评论问题 - 我写了一些关于函数的文字
    • @mgurov 您的问题可能早就解决或解决了,但还是编辑了我的答案...
    【解决方案3】:

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

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

    如果您的应用程序设计正确并且可以正常运行,则永远不应依赖这些 Windows 功能。

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2012-03-31
      • 1970-01-01
      • 2018-06-07
      • 2012-11-04
      • 1970-01-01
      • 2018-04-03
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多