2. 谁能总结个大全出来,以后编程的时候也省点心
3. 有无其他标准库中的函数可以替代这些不安全的函数?
9 个解决方案
#1
都没检查目的内存是否足够大存放下。
#2
没有检测目标内存的大小。
比如,可以利用溢出,改写之前压入栈中的函数返回地址,使程序跳转到它处。
比如,可以利用溢出,改写之前压入栈中的函数返回地址,使程序跳转到它处。
#3
str
ncpy
str ncat
s nprintf
这些函数都是可以指定缓冲区大小的
str ncat
s nprintf
这些函数都是可以指定缓冲区大小的
#4
strcpy_s
strcat_s
sprintf_s
gets_s
这些如果超出输入的buffer大小,程序就会崩掉
strcat_s
sprintf_s
gets_s
这些如果超出输入的buffer大小,程序就会崩掉
#5
strncpy
strncat
什么的虽然也是标准库函数,但是也不安全,因为如果你选择的n比缓冲区大或者有内存区域重叠的情况,都会出问题,而且strncpy很可能不会加'\0'。
没有更安全的标准库函数。但是VC2003以后里可以用都有strcpy_s之类的函数,它们都是安全的。strncpy_s可以指定是否总是添加\0,如果无法满足可以抛出异常。
strncat
什么的虽然也是标准库函数,但是也不安全,因为如果你选择的n比缓冲区大或者有内存区域重叠的情况,都会出问题,而且strncpy很可能不会加'\0'。
没有更安全的标准库函数。但是VC2003以后里可以用都有strcpy_s之类的函数,它们都是安全的。strncpy_s可以指定是否总是添加\0,如果无法满足可以抛出异常。
#6
大家能不能在给出些其他常用的标准库中,有潜在出错可能的函数?
#8
这些所为危险函数的存在,最根本的原因是当前的计算机架构体系导致的,在现在的计算机模型中,代码和数据的区分不是很严格,计算机眼里数据和代码(规则)是一样的,这种色即是空空即是色的行为,导致上述函数的危险性提高了很大
#9
安全都是相对的。一顿吃10斤不含三聚氰胺的婴儿奶粉也会撑死人的。(^_^)
#1
都没检查目的内存是否足够大存放下。
#2
没有检测目标内存的大小。
比如,可以利用溢出,改写之前压入栈中的函数返回地址,使程序跳转到它处。
比如,可以利用溢出,改写之前压入栈中的函数返回地址,使程序跳转到它处。
#3
str
ncpy
str ncat
s nprintf
这些函数都是可以指定缓冲区大小的
str ncat
s nprintf
这些函数都是可以指定缓冲区大小的
#4
strcpy_s
strcat_s
sprintf_s
gets_s
这些如果超出输入的buffer大小,程序就会崩掉
strcat_s
sprintf_s
gets_s
这些如果超出输入的buffer大小,程序就会崩掉
#5
strncpy
strncat
什么的虽然也是标准库函数,但是也不安全,因为如果你选择的n比缓冲区大或者有内存区域重叠的情况,都会出问题,而且strncpy很可能不会加'\0'。
没有更安全的标准库函数。但是VC2003以后里可以用都有strcpy_s之类的函数,它们都是安全的。strncpy_s可以指定是否总是添加\0,如果无法满足可以抛出异常。
strncat
什么的虽然也是标准库函数,但是也不安全,因为如果你选择的n比缓冲区大或者有内存区域重叠的情况,都会出问题,而且strncpy很可能不会加'\0'。
没有更安全的标准库函数。但是VC2003以后里可以用都有strcpy_s之类的函数,它们都是安全的。strncpy_s可以指定是否总是添加\0,如果无法满足可以抛出异常。
#6
大家能不能在给出些其他常用的标准库中,有潜在出错可能的函数?
#7
编译器有个GS选项是可以阻止检查缓冲区溢出的,但也有方法可以绕过这个保护机制的。可以去看雪论坛看看
http://bbs.pediy.com/index.php
http://bbs.pediy.com/index.php
#8
这些所为危险函数的存在,最根本的原因是当前的计算机架构体系导致的,在现在的计算机模型中,代码和数据的区分不是很严格,计算机眼里数据和代码(规则)是一样的,这种色即是空空即是色的行为,导致上述函数的危险性提高了很大
#9
安全都是相对的。一顿吃10斤不含三聚氰胺的婴儿奶粉也会撑死人的。(^_^)