C 标准库 函数 源代码的实现 和 分析

本文详细解析了C语言中strcat、strncat、strcpy、strncpy、memcpy、memmove和memset等标准库函数的源代码实现,并探讨了这些函数存在的安全隐患,特别是在处理边界条件和内存溢出问题时可能导致的问题。建议在实际使用中结合安全检查避免潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//库函数实现
char *strcat (char *dst, const char *src)
{
  char *p = dst;
  while (*p)
    p++;
  while ((*p++ = *src++))
    ;
  return dst;
}

char *strncat (char *s1, const char *s2, long unsigned int n)
{
  char *dest = s1;
  char c;

  while (*s1) s1++;
 c = '/0';
  while (n > 0)
 {
      c = *s2++;
  *s1++ = c;
      if (c == '/0')
  return dest;
      n--;
    }
  if (c != '/0')
    *s1 = '/0';
  return dest;
}
 
char * strcpy (char *d, const char *s)//
{
  char *r = d;
  while ((*d++ = *s++));
  return r;
}

char *strncpy (char *s1, const char *s2, long unsigned int n)
{
  char *dest = s1;

  for (; *s2 && n; n--) //n 如果大于s2的长度,则设置0
    *s1++ = *s2++;
  while (n--)
    *s1++ = 0;
  return dest;
}

void * memcpy (void *dst, const void *src, long unsigned int n)
{
  const char *srcp;
  char *dstp;

  srcp = src;
  dstp = dst;
  while (n-- != 0)
    *dstp++ = *srcp++;

  return dst;
}

void *memmove (void *dst, const void *src, long unsigned int n)
{
  const char *srcp;
  char *dstp;

  srcp = src;
  dstp = dst;
  if (srcp < dstp)
    while (n-- != 0)
      dstp[n] = srcp[n];
  else
    while (n-- != 0)
      *dstp++ = *srcp++;

  return dst;
}

void *memset (void *dst, int c, long unsigned int n)
{
  while (n-- != 0)
    n[(char *) dst] = c; // 即 (char*)dst[n] = c;

  return dst;
}

 

库函数力求简洁,因此存在一定的安全的问题,这是在使用过程中特别注意的地方。也因此VC2005才推出_s的所谓的安全函数。也就是多加了判断位。

 

比如:

 

 char p1[11] = "0123456789";
 char *p2 = &p1[5];
 strcat(p1, p2);

 或

 strncat(p1, p2, 5);

 

会出现很大问题,死循环导致堆栈溢出而core dump

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值