【glibc源码分析】--strcpy.c 字符串复制
strcpy是常用的字符串复制函数,经常在面试中考到。该文件位于glibc源码的string目录中。
在线资源路径:
http://www.oschina.net/code/explore/glibc-2.9/string/strcpy.c
快速查看源码如下:
1 /* Copyright (C) 1991, 1997, 2000, 2003 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <http://www.gnu.org/licenses/>. */ 17 18 #include <stddef.h> /* 用到了ptrdiff_t */ 19 #include <string.h> 20 #include <memcopy.h> 21 #include <bp-checks.h> /* 定义了CHECK_BOUNDS_LOW和CHECK_BOUNDS_HIGH */ 22 23 #undef strcpy 24 25 /* Copy SRC to DEST. */ 26 char * 27 strcpy (dest, src) 28 char *dest; 29 const char *src; 30 { 31 char c; 32 char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src); 33 const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1; 34 size_t n; 35 36 do 37 { 38 c = *s++; 39 s[off] = c; /* 注意这种写法, s[off]相当于 *(s+off) */ 40 } 41 while (c != '\0'); 42 43 n = s - src; 44 (void) CHECK_BOUNDS_HIGH (src + n); 45 (void) CHECK_BOUNDS_HIGH (dest + n); 46 47 return dest; 48 } 49 libc_hidden_builtin_def (strcpy)
以上的算法主要通过计算好两个字符串的偏移量,然后循环遍历src字符串,逐个赋值给dest的相应位置;gnu的源码一般都比较复杂,进行了相应的范围检查等处理;
再来看个简单的,比较独立的代码:
1 char * strcpy(char * dest, const char * src) 2 { 3 if ( dest == NULL || src == NULL) // 地址检查 4 { 5 return NULL; 6 } 7 8 if ( dest == src) // 相同地址检查 9 { 10 return dest; 11 } 12 13 char * str = dest; 14 while ( ( *str++ = *src++ ) != '\0' ) // 循环复制 15 { 16 ; 17 } 18 19 return dest; 20 }
注意,以上代码采用了清爽的缩进格式,保证代码的清晰和可读性; 第8行的检查比较容易漏掉,这个是重点;
转载于:https://www.cnblogs.com/QuLory/archive/2012/09/17/glibc-strcpy.html
【glibc源码分析】--strcpy.c 字符串复制相关推荐
- Linux内核源码分析—从用户空间复制数据到内核空间
Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...
- MySQL · 源码分析 · MySQL 半同步复制数据一致性分析
简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_mas ...
- glibc源码分析之utime系列函数
glibc中关于utime的函数有utime,utimes.它们都是系统调用的封装函数. utime函数由脚本生成.生成的.S文件的内容为: #define SYSCALL_NAME utime #d ...
- 三星uboot1.1.6源码分析——start.s(4)——从NAND复制源码到RAM(3)
通过上两篇博客终于把从NAND复制源码到RAM的c语言写的部分说完了,现在回到start.s中,接着分析余下的代码. ----------------------------------------- ...
- php cut截取字符串,php源码分析之DZX1.5字符串截断函数cutstr用法
本文实例讲述了php源码分析之DZX1.5字符串截断函数cutstr用法.分享给大家供大家参考.具体分析如下: /** * 函数来源DZX1.5,文件所在 /source/function/funct ...
- AFL二三事——源码分析
AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...
- 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)
[SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...
- 高性能网络I/O框架-netmap源码分析
前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西.其设计思想与业界不谋而合--因为为了提高性能,几个性能瓶颈放在那里,解决方法自然也是类似的. netmap的出现,它既实现了一 ...
- 网站压测工具 Webbench 源码分析
介绍 Webbench是一个在Linux下使用的非常简单的网站压测工具.它的源代码只有500多行,挺值得一看的开源项目. 实现原理 只是简单的fork()出多个子进程模拟客户端去访问设定的URL,测试 ...
最新文章
- eclipse创建python项目提示Project interpreter not specified
- 如何通过redisTemplate获得key的过期时间
- 好程序员Web前端分享程序的三大结构(二)while循环
- JavaScript 省市级联效果
- 如何分析线程转储– IBM VM
- rlwrap解决sqlplus上下键和backspace键找历史命令
- ssm实现管理员和用户_基于SSM的网上水果生鲜超市商城管理系统
- 面试题1:赋值运算符函数
- 第一次点击button, view视图出现;第二次点击button,view视图消失
- python进阶(一)
- mysql 镜像安装方法_MySql镜像安装
- 分享一个关于跨境电商的竞品分析报告
- oracle 英文 简历,英文优秀个人简历模板范文
- react富文本编辑器
- 达梦数据库的服务启动
- 互联网毒瘤——内容农场
- linux下wifi连接方法
- 科大讯飞语音听写app闪退
- 武汉大学计算机学院 教师名录,韩镇副教授-教师名录-国家多媒体软件工程技术研究中心...
- chartjs 动态数据_使用ChartJS构建动态仪表板
热门文章
- python怎么读取图像的txt标注_使用包含文件名的.txt文件读取图像数据
- 计算机网络课程设计之网络嗅探器的设计与实现
- spring boot jwt_springboot整合JWT
- 基于matlab数字识别算法系统设计与实现(含源文件)
- PHP笔记-使用PHPStorm断点调试php代码
- 前端笔记-vue中引入Bootstrap
- Spring Boot文档阅读笔记-@SpringBootApplication官方解析与实例(1.5.19)
- axios post body参数_vue之axios封装
- linux单点登录命令,配置RHEV中LINUX 虚拟机使用ACTIVE DIRECTORY(AD域)实现单点登录的方法...
- vue引用electron_如何搞定跨平台桌面开发?Electron助你快速起步