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 \n",pbuf1);

}

//这是一个测试2

char *pbuf2 = new char[10];

bool br2 = IsBadWritePtr(pbuf2,10);  //返回的值是true

if(!br2)

{

memcpy(pbuf2,"222222222",10);

printf("Display2:%s \n",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));

C++ 中判断非空的错误指针

时间: 2024-12-28 20:48:39

C++ 中判断非空的错误指针的相关文章

javascript判断非空

1 /* 2 *判断非空 3 * 4 */ 5 function isEmpty(val){ 6 if(val == null)return true; 7 if(val == undefined || val == 'undefined') return true; 8 if(val == "") return true; 9 if(val.length == 0) return true; 10 if(!/[^(^\s*)|(\s*$)]/.test(val)) return tr

JS中if判断 非空即为真 非0即为真

1.字符串参与判断时:非空即为真判断字符串为空的方法if(str!=null && str!=undefined && str !='')可简写为if(!str){    console.log(str)}2.数字参与if判断:非0即为真 var i = 0;if(i){ alert('here');}else{ alert('test is ok!');} 输出结果为here var i = 0;if(i){ alert('here');}else{ alert('tes

freemaker判断非空

判断list非空 <#if users?exists && users?size > 0 >     <#list users as u>         ${u.username}-----${u.password}     </#list> </#if> 判断对象非空 <#if user??>     username:${user.username}     password:${user.password}<b

Javascript 中的非空判断 undefined,null, NaN的区别

原出处:http://blog.csdn.net/oscar999/article/details/9353713 JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS 的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是在js 中定义变量统一使用 var , 或者不使用var 也可以使用. 那么js 中是否有数据类型的概念呢? 当然有, 使用 typeof 就可以判断这个变量的数据类型: [javasc

C#中判断为空

在判断ComBox是否有选择条目(Item)时,判断出错,原因在于SeletedItem.ToString()存在问题,根本就不能转为String,去掉即可. null 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果 string s=null,的话,是不可以的,因为s是值类型的.另外,注意null与""及String.Empty的区别. 三种常用的字符串判空串方法: Length法:bool isEmpty =

java 对象、集合的非空判断

自我总结,有什么不到位的地方,请各位纠正补充,感激不尽! 目的:使程序更严谨 ***对象验证是否不为空:  if( null != obj ) ***List验证不为空:if( null != list && list.size() > 0 ) ***Map验证不为空:if( null != map && map.size() > 0 ) 好了,废话不多说,上代码 实体类Student(随便起一个) package com.core.test; public c

SpringBoot参数非空校验的非最优实现历程

SpringBoot参数非空校验在网上已经有很多资料了,自己最近要实现这一个功能,大概看了下觉得没什么难度,不想在过程中还是遇到了一些问题,在此记录,希望有遇到和我一样问题的人和过路大神不吝指教. 需求是做一个全局请求参数非空校验和异常拦截,spring提供的@Validated和Hibernate提供的@Valid目前不支持请求参数为基本类型的非空判断,只能是请求参数封装为对象时,判断对象属性非空,所以要自己实现一个对基本类型的非空判断. 首先说下网上原创转载最多的一个思路:实现一个指向方法的

内核中判断返回指针是否错误方法

内核中判断返回指针是否错误的方法:使用IS_ERR或者IS_ERR_OR_NULL. 参考include/linux/err.h #define MAX_ERRNO  4095 #ifndef __ASSEMBLY__ #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) static inline void * __must_check ERR_PTR(long error) { return (void *) e

python sqlalchemy中commit提交错误--项非空不能插入空数据

非常白痴的问题,插入数据库提交失败,一直走IntegrityError错误,没打印错误信息,以为插不进去,弄了好久,最后打印了错误信息 (sqlite3.IntegrityError) samples.file_type may not be NULL [SQL: u'INSERT INTO samples (file_size, file_type, md5, crc32, sha1, sha256, sha512, ssdeep) VALUES (?, ?, ?, ?, ?, ?, ?, ?