具有自动截断功能的函数:对比:strcpy、strncpy、sprintf、snprintf在写入的数据大于缓冲区的情况下如何处理

来源:互联网 发布:mac oracle ide 编辑:程序博客网 时间:2024/06/06 15:18

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

0 0
原创粉丝点击