安全问题和指针误用

不恰当的指针声明

int * ptr1,ptr2; //第一个是int*,第二个是int型
int * ptr1,* ptr2;//两个都是int*

#define PINT int*
PINT ptr1,ptr2;  //第一个是int*,第二个是int

typedef int* PINT; //定义为类型
PINT ptr1,ptr2; //第一个和第二个都是int*型
  • 使用指针之前要进行初始化
  • 一般用NULL初始化
  • 使用malloc类函数后一定要检测一下返回值,检测内存是否分配成功。

一定要匹配指针类型

在小端模式下,不匹配形成的问题

int num=2147483647;
int*pi=#
short *ps=(short*)pi;
printf("%p,%x,%d",pi,*pi,*pi);
printf("%p,%hx,%hd",ps,*ps,*ps);

100,7fffffff,2147483647
100,ffff,-1

在这里插入图片描述

数组越界访问

在使用数组时,一定注意不要越界访问,防止越界访问的方法有,传参时,一同传入数组的长度。

在将数组名赋给指针的时候,指针也要防止出现此种越界的问题。

指针算术运算和结构体

我们应该只对数组使用指针算术运算,因为数组肯定分配在连续的内存块上,不应该将它们用在结构体内,因为结构体的字段可能分配在不连续的内存区域。

typedef struct employee
{
  char name[10];
  int age;
} Employee;

在这里插入图片描述

内存释放问题

  • 重复释放问题
    避免这类漏洞的简单方法是释放指针后总是将其置为NULL,大部分堆管理器都会忽略后续对空指针的释放。

  • 清除敏感数据
    一旦不再需要内存中的敏感数据,马上进行覆写是个好主意。因为当应用程序终止后,大部分操作系统都不会把用到的内存清零,可能将它们分配给别的程序,其它程序就可以访问敏感数据了。

char name[32];
int userID;
char*securityQuestion;

//删除敏感信息
memset(name,0,sizeof(name));
userID=0;
memset(securityQuestion,0,strlen(securityQuestion));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值