修复缓冲区溢出问题
2009-03-07 20:02:33 来源:WEB开发网需要注意的函数包括诸如 strcpy、strcat、gets 等常见函数。但也不能排除所谓的 strcpy 和 strcat 的“安全的 n 版本”- strncpy 和 strncat。这些函数被认为使用起来更安全、可靠,因为它们允许开发人员限制复制到目标缓冲区中的数据的大小。然而,开发人员在使用这些函数时也会出错!请看以下这段代码。您能看出其中的缺点吗?
#define SIZE(b) (sizeof(b))
char buff[128];
strncpy(buff,szSomeData,SIZE(buff));
strncat(buff,szMoreData,SIZE(buff));
strncat(buff,szEvenMoreData,SIZE(buff));
如果您需要提示,请注意每个字符串处理函数的最后一个参数。要放弃吗?在我给出答案之前,我经常会开玩笑说,如果您禁用“不安全”的字符串处理函数,而使用较为安全的 n 版本,则恐怕您要在修复新产生的错误中度过您的余生。以下便是原因所在。首先,最后那个参数不是目标缓冲区的总体大小。它是缓冲区剩余空间的大小,代码每次向 buff 添加内容时,buff 都会有实质的减小。第二个问题是,即使用户传递了缓冲区大小,他们通常也是逐一减小的。那么在计算字符串大小时,您有没有包含末尾的空字符?当我针对这个问题进行读者调查时,通常是对半分。其中一半认为在计算缓冲区大小时确实要考虑末尾空字符,另外一半则不这么认为。第三,在某些情况下,n 版本可能不会以空字符作为结果字符串的结束字符,因此请一定要阅读文档。
如果编写 C++ 代码,请考虑使用 ATL、STL、MFC 或者您最喜欢的字符串处理类来处理字符串,而不要直接处理字节。唯一潜在的不足是可能出现性能的下降,但总的来说,大部分这些类的使用都会使代码更加强大和可维护。
更多精彩
赞助商链接