strlcpy和strlcat

strncpy 等主要的问题还是虽然不会溢出,但是满了就不给缓冲区添加0结束符了,以前在项目里面自己还写了个 safe_strcpy 现在发现早就有了

http://blog.csdn.net/linyt/article/details/4383328

找了一下,代码可以在 libbsd 里面有

/*

 * Appends src to string dst of size siz (unlike strncat, siz is the

 * full size of dst, not space left).  At most siz-1 characters

 * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).

 * Returns strlen(src) + MIN(siz, strlen(initial dst)).

 * If retval >= siz, truncation occurred.

 */

size_t

strlcat(char *dst, const char *src, size_t siz)

{

        char *d = dst;

        const char *s = src;

        size_t n = siz;

        size_t dlen;

        /* Find the end of dst and adjust bytes left but don‘t go past end */

        while (n-- != 0 && *d != ‘\0‘)

                d++;

        dlen = d - dst;

        n = siz - dlen;

        if (n == 0)

                return(dlen + strlen(s));

        while (*s != ‘\0‘) {

                if (n != 1) {

                        *d++ = *s;

                        n--;

                }

                s++;

        }

        *d = ‘\0‘;

        return(dlen + (s - src));       /* count does not include NUL */

}

/*

 * Copy src to string dst of size siz.  At most siz-1 characters

 * will be copied.  Always NUL terminates (unless siz == 0).

 * Returns strlen(src); if retval >= siz, truncation occurred.

 */

size_t

strlcpy(char *dst, const char *src, size_t siz)

{

        char *d = dst;

        const char *s = src;

        size_t n = siz;

        /* Copy as many bytes as will fit */

        if (n != 0) {

                while (--n != 0) {

                        if ((*d++ = *s++) == ‘\0‘)

                                break;

                }

        }

        /* Not enough room in dst, add NUL and traverse rest of src */

        if (n == 0) {

                if (siz != 0)

                        *d = ‘\0‘;              /* NUL-terminate dst */

                while (*s++)

                        ;

        }

        return(s - src - 1);    /* count does not include NUL */

}

时间: 2024-08-09 19:51:46

strlcpy和strlcat的相关文章

Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

概述 随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy() 和strncat() .尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的.本文介绍另一种直观的,一致的,天生安全的字符串拷贝API . 当函数 strncpy()和 strncat()作为 strcpy()和 strcat()的安全版本来使用时,仍然存在一些安全隐患. 这两函数以不同的,非直观的方式来处理NUL 结束符和长度参数,即使有经验的程序员也会混淆

coredump简介与coredump原因总结

from:http://www.cnblogs.com/doctorqbw/archive/2011/12/21/2295962.html 千兵卫博士 coredump简介与coredump原因总结 什么是coredump? 通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等.可以理解为把程序工作的当前状态存储成一个文件.许多程序和操作系统出错时会自动生成一个core文件. 如何使用coredump? coredump可以用在很多场合,使用Linux,或者sol

如何分析coredump

一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件. 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可

造成segmentation fault的可能原因分析(转)

一 造成segment fault,产生core dump的可能原因 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆.应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等

详解coredump

一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件. 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态 存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们

出现segment fault 错误的几种原因

segment fault 段异常各种原因www.MyException.Cn 发布于:2012-11-26 11:48:50 浏览:24次 0 segment fault 段错误各种原因一 造成segment fault,产生core dump的可能原因1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasec

core dump

http://blog.csdn.net/tenfyguo/article/details/8159176/ 一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件. 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是

程序设计基石与实践系列之类型提升、内存分配,数组转指针、打桩和矢量变换

英文出处:Peter Fa?ka: Guide to Advanced Programming in C C语言可用于系统编程.嵌入式系统中,同时也是其他应用程序可能的实现工具之一. 当你对计算机编程怀有强烈兴趣的时候,却对C语言不感冒,这种可能性不大.想全方位地理解C语言是一件极具挑战性的事. Peter Fa?ka 在2014年1月份写下了这篇长文,内容包括:类型提升.内存分配,数组转指针.显式内联.打桩(interpositioning)和矢量变换. 整型溢出和类型提升 多数C程序员以为,

关于Segmentation fault错误

今天写程序时候出现了Segmentation fault,在网上查了一些资料,基本上的原因是,非法的内存访问. 例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释放内存,下面是自己找的一些可能情况,当做提醒自己吧. 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界. b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符. c)