看LIBC源码中关于strncpy实现的问题

lxmuyu lxmuyu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
/* Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#include <string.h>
#include <memcopy.h>

#undef strncpy

#ifndef STRNCPY
#define STRNCPY strncpy
#endif

char *
STRNCPY (char *s1, const char *s2, size_t n)
{
char c;
char *s = s1;

--s1;

if (n >= 4)
{
size_t n4 = n >> 2;

for (;;)
{
c = *s2++;
*++s1 = c;
if (c == '\0')
break;
c = *s2++;
*++s1 = c;
if (c == '\0')
break;
c = *s2++;
*++s1 = c;
if (c == '\0')
break;
c = *s2++;
*++s1 = c;
if (c == '\0')
break;
if (--n4 == 0)
goto last_chars;
}
n = n - (s1 - s) - 1;
if (n == 0)
return s;
goto zero_fill;
}

last_chars:
n &= 3;
if (n == 0)
return s;

do
{
c = *s2++;
*++s1 = c;
if (--n == 0)
return s;
}
while (c != '\0');

zero_fill:
do
*++s1 = '\0';
while (--n > 0);

return s;
}
libc_hidden_builtin_def (strncpy)

网上查了下相关的资料,有一个回答是这样
这不明摆着吗,现在的机器字长多半是32位,4字节,n>>2就是把char划成32个位一起处理,到了汇编层次,这个代码看起来就像这样:
loop:
inc %esi
inc %edi
movb src(, %esi), %al
movb %al, dst(, %edi)
inc %esi
inc %edi
movb src(, %esi), %al
movb %al, dst(, %edi)
inc %esi
inc %edi
movb src(, %esi), %al
movb %al, dst(, %edi)
inc %esi
inc %edi
movb src(, %esi), %al
movb %al, dst(, %edi)
jmp loop
然后编译器只要稍微聪明一些,就能够将它们拼凑到一起:
loop:
inc %esi
inc %edi
movl src(, %esi, 4), %eax
movl %eax, dst(, %edi, 4)
jmp loop


问题:
1 这样实现是怎么做到优化的?
  2 最后的编译器是否像回答中的那样 ?
...全文

相关推荐

linux C 安全 编码实例 大牛 必看源码

NetworkSecureCode"则更关注网络编程中的安全问题,如如何安全地使用套接字进行通信,防止中间人攻击和数据泄露;理解SSL/TLS协议以实现安全的数据传输;以及如何处理网络异常和错误,确保程序在面对网络波动时仍能保持稳定

tange08

dogctl-ep02.tar.gz

源码结构清晰,遵循POSIX标准接口规范,依赖极少,通常仅需libc及基础系统调用支持,不引入第三方运行时框架或虚拟机环境。

应用市场

C++ strcpy_s()用法详解[源码]

而strncpy()函数虽然提供了限制复制长度的功能,但其使用起来相对复杂,需要程序员手动管理字符串的终止,否则容易产生未终止的字符串,导致潜在的安全问题。

rgv2345678

单片机使用cJSON库[源码]

所有字符串操作严格遵循C标准,未使用strncpy_s等安全扩展函数,兼容所有裸机环境;数字解析采用手工实现的ASCII转浮点算法,不调用libc中的strtod,保证跨平台一致性;内存释放逻辑确保整棵树节点按后序遍历顺序逐个释放

orange

深入C标准库源码:从内存管理到性能优化的系统编程内功修炼

C标准库作为系统编程的基石,提供了内存管理、字符串操作、文件I/O等核心功能。其实现原理涉及底层内存分配机制、缓冲区管理和线程安全等关键技术。理解这些原理不仅能帮助开发者编写更健壮、高效的代码,还能在调试内存泄漏、性能瓶颈等复杂问题时提供关键洞察。例如,通过分析malloc和free的内存分配策略,可以深入理解堆管理中的chunk结构和多级缓存机制;而研究字符串函数如strcpy和memcpy的实现,则能揭示安全编程的最佳实践和硬件级性能优化技巧。这些知识对于从事嵌入式开发、高性能服务器编程等领域的工程师尤

眠子子子
评论 10
收藏 已收藏
分享
返回顶部
lxmuyu
C语言 70,040 成员 243,237 内容