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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值