首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用strncpy替换strcpy

用strncpy替换strcpy
EN

Stack Overflow用户
提问于 2013-11-14 17:38:13
回答 2查看 4.3K关注 0票数 4

假设我有一些遗留代码,这些代码是使用对C STL函数(如strcpy )的不安全调用编写的。我们都知道strcpy是不安全的,因为它使程序容易受到缓冲区溢出问题的影响。假设我想将对strcpy的所有调用替换为对strncpy的调用。替换对strcpy(dest, src)的所有调用的技术包括用参数(dest, src, length of dest - 1)调用strncpy,然后用\0终止dest。我知道问题在于,我们并不总是知道dest的长度,因为它可能是一个指向堆上分配的内存的指针。

让我们假设我可以计算出每个调用站点的dest长度。我可以将对strcpy的所有调用替换为对strncpy的调用,这将保证我的程序不受缓冲区溢出攻击的影响(至少避免不正确地使用strcpy)。但是,这种方法可能会悄悄地截断数据,并以一种不受欢迎的方式改变程序行为。这比检测截断和中止程序更好吗?还是允许截断但也记录它更好?

我是从对开发自动修复遗留代码的方法感兴趣的人的角度来问的。有没有人对如何最好地处理这个问题有任何想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-14 17:49:33

我们都知道strcpy是不安全的,因为它使程序容易受到缓冲区溢出问题的影响。

这一点都不是strcpy的错误:程序员应该确保字符串符合他们的缓冲区,例如,在复制之前调用strlen,或者确保传入的字符串不可能比缓冲区长。

假设我想将对strcpy的所有调用替换为对strncpy的调用

您不应该这样做,除非您使用的是固定大小的字符串:请记住,strncpy不仅复制到终止空,而且还用空字节填充字符串的其余部分。如果您正在寻找strcpy的“现代替代品”,请考虑使用strlcpy

这种方法可能会悄悄地截断数据,并以一种不受欢迎的方式改变程序行为。这比检测截断和中止程序更好吗?还是允许截断但也记录它更好?

这完全取决于你。这取决于您的设计中发生这种截断的位置:如果在向web服务发送身份验证信息的代码中发生这种情况,则最好立即停止该进程;如果在将跟踪消息写入日志的代码中发生这种情况,则忽略该问题或将其记录并继续进行可能是可以的。遗憾的是,您不能自动决定它,因为需要一定程度的程序理解。

票数 6
EN

Stack Overflow用户

发布于 2013-11-14 17:50:53

strncpy不是STL函数。:)C没有STL库。我不认为把所有的strcpy替换为strncpy是个好主意。应根据具体情况采取不同的做法。在大多数情况下,使用strcpy就足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19984535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档