2011-11-03 47 views
3

在这里,我想了解strcpy() and strcat()缺点为什么的strcpy()和strcat的()是不是在嵌入式领域良好

我想了解在嵌入式领域/环境这些功能的危险区域。

有人告诉我,我们从来没有在嵌入域中使用strcpy,strcat and strlen函数,因为它以null结尾,有时我们使用加密数据,而null字符出现,所以我们不能得到实际结果,因为这些函数在空字符上停止。

所以我想知道所有的东西和这些功能的其他选择。我们如何使用其他替代函数

回答

13

str *函数适用于字符串。如果您正在处理字符串,只要正确使用它们就可以使用 - 如果使用不正确,则很容易创建buffer overflow

如果你正在处理二进制数据,它听起来就像你一样,字符串处理函数是不合适的(它们是指字符串毕竟不是二进制数据)。使用mem *函数来处理二进制数据。

在C中,字符串是以nul字节结尾的字符序列。如果你正在处理二进制数据,那么很可能是那个数据中的值为0的字符,该字符串处理函数假定是该字符串的结尾,或者该数据不包含任何nul字节并且不是nul终止,这将导致字符串函数运行超过缓冲区的末尾。

+0

如果我们不使用二进制数据比strlen()还好吗?但是如果我们正在寻找其他替代方法或者使其他函数查找字符串长度超过此函数,那么也可以使用与strlen()相同的逻辑。所以它的函数也停在NULL字符处。 – user1089679

3

那么,这些函数确实复制了以空字符结尾的字符串,而不仅仅是在嵌入式域中。根据您的需要,您可能需要使用mem*函数。

0

原因就是你说的话:

,因为它与空,有时候我们工作中的加密数据和空字符来结束,所以我们不能得到实际的结果,因为这些功能停止对空字符。

而且替代品,我建议strn*系列一样的strncpystrnlen。这里意味着字符串的最大可能长度。

您可能需要查找C标准库引用并查找有关这些函数的某些详细信息。

+0

如果不是加密数据,我会建议'strn *'。我的意思是,这听起来像这个数据与字符串无关。 –

1

如果您担心覆盖缓冲区(人人都应该),请改用strncpystrncat。我看到strlen没有问题。

1

此问题特定于您描述的系统,而不是嵌入式系统本身。无论哪种方式,字符串函数都不适合您描述的应用程序。我想你应该简单地被告知你不能在你的特定应用程序的加密数据上使用字符串函数。这不是嵌入式系统甚至字符串库的问题。这完全取决于你的加密字符串的性质 - 一旦加密后它们不再是C字符串,所以任何字符串库操作将不再有效 - 它变成了数据,并且你有责任保留任何必要的元数据长度等。你可以使用Pascal风格的字符串来做到这一点(与一个合适的附带库)。

现在通常C字符串库和C字符串本身为所有系统提出了许多问题,而不仅仅是嵌入式。请参阅this article by Joel Spolsky以了解为什么使用C字符串函数时要特别小心,特别是strcat()。

2

正如其他人已经回答,他们工作良好的字符串。加密数据不能被视为字符串。然而,在嵌入式系统中,尤其是在诸如汽车/医疗/航空电子设备等的高完整性实时嵌入式系统中使用C库功能是存在的。在这样的项目中,编码标准将是用过,比如MISRA-C。

绝大多数C库可能与您的编码标准不兼容。即使你有选择(至少在MISRA-C)做出偏差,你仍然需要验证整个图书馆。例如,你将不得不验证整个string.h,只是因为你使用了strlen()。在这样的系统中通常的做法是自己编写所有的函数,特别是像strlen()这样简单的函数,你可以在一分钟内编写自己的函数。

但是大多数嵌入式系统对质量和安全性没有这么高的要求,然后库函数就更喜欢了。特别是memcpy()和类似的搜索/排序/移动函数,可能会被编译器大量优化。

0

正如其他人所说的str *函数是针对字符串的,而不是二进制数据。但是,我建议当你使用字符串时,你应该考虑诸如strlcpy()而不是strcpy(),strlcat()而不是strcat()的函数。

它们不是标准功能,但你可以很容易地找到它们的副本(或者真的只是写你自己的副本)。它们将目标缓冲区的大小作为其标准表兄弟的额外参数,并且旨在避免缓冲区溢出。

它可能看起来像一个强制性,必须传递一个指针块的大小,无论你在哪里使用它,但恐怕这就是C编程的意义所在。

至少直到我们得到更聪明的指针。

相关问题