zoukankan      html  css  js  c++  java
  • C++ 中判断非空的错误指针

    最近在写网络上的东西,程序经过长时间的运行,会出现崩溃的问题,经过DUMP文件的查看,发现在recv的地方接收返回值的时候,数据的长度异常的大差不多16亿多字节.而查看分配后的char指针显示为错误的指针,这可能是接收数据不对应产生的问题解决思路如下:
      1.对返回值长度进行判断,如果超过项目内最大的返回值就直接return(比如我项目内的最大返回值为5000,哪么我设定的值为10000);
      2.对char指针进行判断,由于这里返回的数据是有的,只是解析不出来而已,这里就是一个非空的错误指针,所以进行二次验证,使用IsBadWritePtr这个API如下实例:
    BOOL WINAPI IsBadWritePtr(
    _In_ LPVOID LP,
    _In_ UINT_PTR UCB
    );
      参数
      LP [中]
      一个指向内存块的第一个字节。
      UCB [中]
      该内存块的大小,以字节为单位。如果这个参数是零,则返回值是零。
      返回值
      如果调用进程具有写访问指定的内存范围内的所有字节,则返回值为零。
      如果调用进程不具有写访问指定的内存范围内的所有字节,则返回值为非零值。
      如果应用程序在调试器下运行,进程不具有写访问权限在指定的内存范围内的所有字节,该函数会导致第一次机会STATUS_ACCESS_VIOLATION例外。调试器可以被配置为打破这个条件??。恢复执行的过程在调试器中后,该功能将继续像往常一样,并返回一个非零值这个行为是经过设计,并作为辅助调试。
    //----------------------------------------------------------------------------
    //这是一个测试1
    char *pbuf1 = new char[10];
    pbuf1 = (char *)0x0;   //经过这里赋值 pbuf现在是一个错误的指针
    bool br1 = IsBadWritePtr(pbuf1,10);  //返回的值是true
    if(!br1)
    {
    memcpy(pbuf1,"111111111",10);
    cout << pbuf1 << endl;
    printf("Display1:%s ",pbuf1);
    }
    //这是一个测试2
    char *pbuf2 = new char[10];
    bool br2 = IsBadWritePtr(pbuf2,10);  //返回的值是true
    if(!br2)
    {
    memcpy(pbuf2,"222222222",10);
    printf("Display2:%s ",pbuf2);
    }
    //输出结果
    //Display2:222222222
    //----------------------------------------------------------------------------
    MFC里也可以使用AfxIsValidAddress方法判断。
    // Allocate a 5 character array, which should have a valid memory address.
    char *array = new char[5];
    // Create a null pointer, which should be an invalid memory address.
    char *null = (char *)0x0;
    ASSERT(AfxIsValidAddress(array, 5));
    ASSERT(!AfxIsValidAddress(null, 5));
  • 相关阅读:
    牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)
    牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
    牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)
    牛客小白月赛12 I 华华和月月逛公园 (tarjian 求桥)
    Tourist's Notes CodeForces
    Educational Codeforces Round 71 (Rated for Div. 2) E XOR Guessing (二进制分组,交互)
    Tunnel Warfare HDU
    蓝桥杯第三届总决赛
    HDU 1695(数论,筛选+素因子分解+容斥)
    lightoj 1248 Dice (III)(几何分布+期望)
  • 原文地址:https://www.cnblogs.com/lidabo/p/3708671.html
Copyright © 2011-2022 走看看