慕仙2934391
2017-11-22 17:01
char a[9]="hello "; char a1[]="world"; strcat(a,a1); printf("%d",strlen(a)); printf("%s",a);
这段代码中字符串a的内存空间不足,但输出无错,且strlen(a)=11不变,这是为什么呢?
百度到的,我懂了,你看看
这个函数的参数是指针类型,函数中也只是通过指针来读写这些内存,编译器无从得知这几块内存到底多大,所以编译阶段编译器不会报错。
函数的行为大致就是先找到第一个参数所指的内存中字符串结尾的位置,然后从此处开始依次写入第二个参数中的字符...直到写完。函数也根本不知道第一个参数所指的内存空间到底够不够大,所以函数本身也不会对此检查。
而在运行时,如果向第一个参数处写入了过多的字符,则有可能会引起问题,也有可能不会:
假如第一个参数所指的内存空间后面的内存刚好也是可读写的,那么函数就继续向其中写入字符,虽然这已经是算写“越界”了,但函数不知道啊。 这样后面输出时就会把这字符串完整地输出。
但假如第一个参数所指内存后面不可写,到函数写越界时就会引起运行时错误。
所以这样的代码在很多时候不会触发运行时错误而运行出看似正确的结果,但这是非常错误的代码! 即便后续的内存是可写的,但也许其中存着其他数据,写越界就有可能覆盖这些数据,引起其他bug,这是严重的安全隐患! 其实所谓“缓冲区溢出漏洞”大致就是这样来的。
C语言入门
926211 学习 · 20797 问题
相似问题