将 strcpy 替换为 strncpy



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

假设我可以计算出每个调用站点的dest长度。我可以将所有对strcpy的调用替换为对strncpy的调用,这将保证我的程序不受缓冲区溢出攻击(至少由于不当使用strcpy)。但是,此方法可能会以不希望的方式以无提示方式截断数据并更改程序行为。这是比检测截断和中止程序更好的方法吗?还是允许截断但记录它更好?

我是从有兴趣开发一种修补遗留代码的自动化方法的人的角度问的。有没有人对如何最好地解决这个问题有任何想法?

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

这丝毫不是strcpy的错:程序员有责任确保字符串适合他们的缓冲区,例如,通过在复制之前调用strlen,或者确保传入的字符串不可能超过他们的缓冲区。

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

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

此方法可能会以不理想的方式以无提示方式截断数据并更改程序行为。这是比检测截断和中止程序更好的方法吗?还是允许截断但记录它更好?

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

>strncpy 不是 STL 函数:)C 没有 STL 库。我认为将所有出现的 strcpy 替换为 strncpy 不是一个好主意。方法应根据情况而有所不同。在大多数情况下,使用 strcpy 就足够了。

最新更新