C语言的指针在提供编程便利的同时,却带来了很多潜在的内存安全问题。见以下例子:
#include <stdio.h> int main() { char string_buff[12]; unsigned int i_not_zero = 0xFF; sprintf(string_buff, "Hello,world!"); printf("i = %x\r\n", i_not_zero); return 0; }
该程序(不正确)的输出为:
i = 0
上述代码使用sprintf修改了string_buff指针所指向的char型数组。但是由于在申明数组长度的时候,没有考虑到字符串结束符’\0’,所以实际写入时不慎篡改了下一位内存地址的内容(此例中为i_not_zero, 使用MinGW gcc)。在实际程序中,此类bug一般很难被发现,尤其是还有其他程序在正常修改该值时,一般先会去排查和该变量有关的程序。
这只是一个因为不慎所导致的内存溢出问题,而在一些极端的黑客代码中,经常会见到通过内存变量和函数的指针地址反向访问、修改堆栈,从而获得系统的权限。可见指针作为C语言的一个重要(但是晦涩的)组成部分,无形中降低了系统的可靠性和安全性,需要挑战programmer的debug能力。
>> 本文章版权归作者所有,如需转载请联系作者授权许可。
>> 原文来自: 云飞机器人实验室
>> 原文地址: C语言 | 陷阱:数组溢出导致内存被意外修改
>> 关于我们: 关于云飞实验室
>> 支持我们: 帮助我们可持续发展
The post C语言 | 陷阱:数组溢出导致内存被意外修改 appeared first on 云飞机器人实验室.