1、strcpy
manpage:什么情况都有可能发生。
实验结果(fedora14):越界写。
结论:程序员必须保证缓冲区足够。
2、strncpy(dst, src, len)
manpage:填充'\0'在dst(前len个)比src多的剩余的空间,不自动在末尾填'\0'。
实验结果:填补剩余的空间,不自动在末尾填'\0'。
3、sprintf
manpage: 如果dest缓冲区小,则越界覆盖。
4、snprintf(dst, len, src)
manpage:具有截断功能;不填充'\0',如果dest缓冲区小于src(snprintf第二个参数)则越界覆盖。(包括vsnprintf)
5、strndup和strndupa
同样具有截断功能,不填充'\0',但前者从堆上申请空间,后者从栈上申请空间。
6、strncat(dst, src,n)
dst的剩余空间一定要大于或等于n+1,原因在于strncat有自动截断功能。
注:实验环境使用GCC编译器和Linux操作系统。
小结:
带n的函数:当给的数据量超出n时会自动截断;如果dest的缓冲区小于限制的最大字符数,那么就如同不带n的函数一样,越界覆盖。
其他具有自动截断功能的函数:
gethostname(char *, ssize_t);
strndup、strndupa、fgets
可overlap的函数:
memmove、bcopy(deprecate)
具有字符串截取功能的函数:
strtok,memccpy