FFmpeg源码:av_strlcpy函数分析

devtools/2025/3/14 22:21:03/

一、引言

在C/C++编程中经常会用到strcpy这个字符串复制函数。strcpy是C/C++中的一个标准函数,可以把含有'\0'结束符的字符串复制到另一个地址空间。但是strcpy不会检查目标数组dst的大小是否足以容纳源字符串src,如果目标数组太小,将会导致缓冲区溢出。针对该问题很多C/C++开源库都会选择自己实现strcpy函数来保证安全性。而FFmpeg自定义了av_strlcpy函数,在实现strcpy函数功能的同时保证不会造成缓冲区溢出。

二、av_strlcpy函数的声明

av_strlcpy函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavutil/avstring.h中:

/*** Copy the string src to dst, but no more than size - 1 bytes, and* null-terminate dst.** This function is the same as BSD strlcpy().** @param dst destination buffer* @param src source string* @param size size of destination buffer* @return the length of src** @warning since the return value is the length of src, src absolutely* _must_ be a properly 0-terminated string, otherwise this will read beyond* the end of the buffer and possibly crash.*/
size_t av_strlcpy(char *dst, const char *src, size_t size);

该函数的作用是:在已知dst缓冲区大小并不会造成缓冲区溢出前提下,将src地址开始的字符串复制到以dst开始的地址空间。

形参dst:输出型参数,目的字符串开始的指针(即目标缓冲区)。

形参src:输入型参数,源字符串的开始地址。

形参size:输入型参数,dst缓冲区的大小。

返回值:src字符串的大小。

三、av_strlcpy函数的定义

av_strlcpy函数定义在libavutil/avstring.c中:

size_t av_strlcpy(char *dst, const char *src, size_t size)
{size_t len = 0;while (++len < size && *src)*dst++ = *src++;if (len <= size)*dst = 0;return len + strlen(src) - 1;
}

四、参考

《百度百科——strlcpy》


http://www.ppmy.cn/devtools/159840.html

相关文章

基于Spring Boot+Vue的宠物服务管理系统(源码+文档)

项目简介 宠物服务管理系统实现了以下功能&#xff1a; 基于Spring BootVue的宠物服务管理系统的主要使用者分为用户管理模块&#xff0c;由于系统运行在互联网络中&#xff0c;一些游客或者病毒恶意进行注册&#xff0c;产生大量的垃圾用户信息&#xff0c;管理员可以对这些…

【Python pro】基础语法元素

第一部分 数据类型 1.基本类型 数字、字符串、布尔 1.1 数字 int 整型 6float 浮点型 6.0complex 复数 34j1.2 字符串 str 字符串 1.组成&#xff1a;数字、字母、空格、其他字符等 2.表达&#xff1a;" "或者’ ’ "python 123 #$"1.3 布尔 bool 布…

container::erase

下列容器自带erase&#xff0c;C20中又定义了非成员的erase_if给下列容器&#xff1a; std::map::erase std::set::erase std::multimap::erase std::multiset::erase std::unordered_map::erase std::unordered_set::erase std::unordered_multimap::erase std::unordered_mu…

DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析

一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…

2024 年 CSDN 博客之星年度评选:技术创作与影响力的碰撞(统计时间2025-02-17 11:06:06)

摘要&#xff1a;在技术的海洋里&#xff0c;每一位博主都像是一座独特的灯塔&#xff0c;用自己创作的光芒照亮他人前行的道路。2024 年 CSDN 博客之星年度评选活动&#xff0c;正是对这些灯塔的一次盛大检阅&#xff0c;让我们看到了众多优秀博主在技术创作领域的卓越表现以及…

【Elasticsearch】`join`字段类型

Elasticsearch 的join字段类型是一种特殊的字段&#xff0c;用于在同一个索引内的文档之间建立父子关系。这种字段类型适用于需要表示一对多关系的场景&#xff0c;例如“作者-书籍”或“问题-答案”等。以下是关于join字段类型的详细说明&#xff1a; 1.定义join字段 join字…

深度学习-119-Text2SQL之实现的三种技术途径

文章目录 1 Text2SQL的实现路径2 基于prompt template的方法2.1 Text2SQL的Prompt的组成部分2.2 提示词模板2.3 基于模型qwen2:7b2.4 基于模型llama3.22.5 基于模型deepseek-r1:1.5b3 基于Chain的方法3.1 基于SQLDatabaseChain的方法3.1.1 创建数据库插入数据3.1.2 基于模型lla…

使用AWS Amplify AI Kit和Neon Postgres构建基于RAG的应用程序

序言 现代应用程序开发已经转变为不仅包括提供出色开发人员体验&#xff08;DX&#xff09;的工具&#xff0c;还包括简单入门和生产路径之间的合理平衡。正是这种情绪激发了Amplify AI kit的发布。这种对常见AI任务&#xff08;如与大型语言模型&#xff08;LLM&#xff09;对…