我想知道strcpy() and strcat()
缺点
我想了解嵌入式域/环境中的这些功能危险区域。
有人告诉我,我们从不在嵌入域中使用strcpy,strcat and strlen
函数,因为它以null结尾,有时我们处理加密数据和null字符,所以我们无法获得实际结果,因为这些函数在null字符上停止。
所以我想了解这些功能的所有内容和其他替代方法。我们如何使用其他替代功能
答案 0 :(得分:13)
str *函数适用于字符串。如果您正在处理字符串,只要您正确使用字符串就可以使用它们 - 如果您错误地使用字符串,则很容易创建buffer overflow。
如果你正在处理二进制数据,听起来就像你一样,字符串处理函数是不合适的(毕竟它们用于字符串,而不是二进制数据)。使用mem *函数处理二进制数据。
在C中,字符串是以nul字节结尾的字符序列。如果您正在处理二进制数据,那么很可能是该数据中值为0的char,字符串处理函数假定为字符串的结尾,或者数据不包含任何nul字节且不是nul终止,这将导致字符串函数超出缓冲区的末尾。
答案 1 :(得分:3)
好吧,这些函数确实复制了以null结尾的字符串,而不仅仅是嵌入式域。根据您的需要,您可能希望使用mem*
函数。
答案 2 :(得分:2)
正如其他人已经回答的那样,它们可以很好地处理字符串。加密数据不能视为字符串。
然而,在嵌入式系统中使用任何 C库函数的方面,特别是在高完整性实时嵌入式系统中,例如汽车/医疗/航空电子设备等。在这样的项目中,将使用编码标准,例如MISRA-C。
绝大多数C库可能与您的编码标准不兼容。即使你有选择(至少在MISRA-C中)做出偏差,你仍然需要验证整个库。例如,您必须验证整个string.h,因为您使用了strlen()。这种系统中的常见做法是自己编写所有函数,特别是strlen()之类的简单函数,您可以在一分钟内自己编写。
但是大多数嵌入式系统对质量和安全性没有如此高的要求,因此库函数更受欢迎。特别是memcpy()和类似的搜索/排序/移动函数,可能会被编译器大量优化。
答案 3 :(得分:1)
如果您担心覆盖缓冲区(每个人都应该这样做),请改用strncpy
或strncat
。我认为strlen
没有问题。
答案 4 :(得分:1)
此问题特定于您描述的系统,而不是嵌入式系统本身。无论哪种方式,字符串函数都不适合您描述的应用程序。我认为您应该被告知您不能在特定应用程序的加密数据上使用字符串函数。这不是嵌入式系统,甚至是字符串库的问题。这完全取决于您加密字符串的性质 - 它们在加密后不再是C字符串,因此任何字符串库操作都将不再有效 - 它只是数据,您有责任保留任何必要的元数据例如,您可以使用Pascal样式字符串(使用合适的附带库)。
现在一般来说,C字符串库和C字符串本身为所有系统提出了许多问题,而不仅仅是嵌入式问题。请参阅this article by Joel Spolsky以了解在使用C字符串函数时应该谨慎使用的原因,尤其是strcat()。
答案 5 :(得分:0)
原因正是你所说的:
因为它以null结尾,有时我们处理加密数据和null字符,所以我们无法得到实际结果,因为这些函数在空字符上停止。
对于替代方案,我建议使用strn*
系列,strncpy
,strnlen
。这里n表示字符串的最大可能长度。
您可能希望找到C标准库参考,并寻求有关这些strn*
函数的一些详细信息。
答案 6 :(得分:0)
正如其他人所说,str *函数用于字符串,而不是二进制数据。
但是,我建议你在使用字符串时,应该考虑strlcpy()而不是strcpy()和strlcat()而不是strcat()等函数。
它们不是标准功能,但您可以很容易地找到它们的副本(或者只是自己编写)。它们将目标缓冲区的大小作为其标准兄弟的额外参数,旨在避免缓冲区溢出。
无论你在哪里使用它,都可能需要传递指针块的大小,但我担心这就是用C编程的内容。
至少在我们获得更聪明的指针之前。