假设我有一些遗留代码是使用对{ST-1}}等C STL函数的不安全调用编写的。我们都知道strcpy
是不安全的,因为它使程序容易受到缓冲区溢出问题的影响。假设我想通过调用strcpy
来取代对strcpy
的所有来电。将所有调用替换为strncpy
的技术包括使用参数strcpy(dest, src)
调用strncpy
,然后使用(dest, src, length of dest - 1)
终止dest
。我知道这个问题是我们并不总是知道\0
的长度,因为它可能是指向堆上分配的内存的指针。
假设我可以计算每个呼叫站点dest
的长度。我可以通过调用dest
替换对strcpy
的所有调用,这将保证我的程序不受缓冲区溢出攻击(至少来自strncpy
的不当使用)。但是,这种方法可能会以不合需要的方式默默地截断数据并改变程序行为。这比检测截断和中止程序更好吗?或者是允许截断还是记录它更好吗?
我是从有兴趣开发修补遗留代码的自动方法的人的角度提出的。有没有人对如何最好地解决这个问题有任何想法?
答案 0 :(得分:6)
我们都知道
strcpy
不安全,因为它使程序容易受到缓冲区溢出问题的影响。
这不是strcpy
最轻微的错误:程序员需要确保字符串适合他们的缓冲区,例如,在复制之前调用strlen
,或确保进入的字符串不能超过其缓冲区。
假设我想通过调用
strcpy
来取代对strncpy
的所有来电
除非使用固定大小的字符串,否则不应该这样做:请记住strncpy
不仅复制到终止空值,而且还用空字节填充字符串的其余部分。如果您正在寻找strcpy
的“现代替代品”,请考虑改用strlcpy
。
这种方法可能会以不合需要的方式无声地截断数据并改变程序行为。这比检测截断和中止程序更好吗?或者是允许截断还是记录它更好吗?
这完全取决于你。这取决于您的设计中发生此类截断的位置:如果它发生在将身份验证信息发送到Web服务的代码中,那么最好立即停止该过程;如果它发生在将跟踪消息写入日志的代码中,则可以忽略该问题,或者记录并继续。遗憾的是,你无法自动决定它,因为需要一定程度的程序理解。
答案 1 :(得分:1)
strncpy不是STL函数。:) C没有STL库。我不认为将strcpy的所有出现替换为strncpy是个好主意。根据情况,方法应该不同。在大多数情况下,使用strcpy就足够了。