在对问题的回答中,不止一个人反对使用
我还强烈建议您习惯使用strncmp()
现在,…以避免路上的许多问题。
或(在Reading In A String and comparing it C中)
确保使用strncmp而不是strcmp。strcmp是深刻的
不安全的。
他们指的是什么问题?
Why does my string comparison fail?和strcmp()
with string specifiers的原因是它们几乎不可避免地导致缓冲区溢出漏洞。但是,不可能用scanf()
溢出缓冲区,对吧?
缓冲区溢出或缓冲区溢出是程序在向缓冲区写入数据时溢出缓冲区边界并覆盖相邻内存的异常情况。
(-gets()
are strongly discouraged)。
由于strcmp()函数从不写入任何缓冲区,因此strcmp()函数不会导致缓冲区溢出,对吧?
为什么人们不鼓励使用strcmp()
,而推荐使用strcmp()
?
最佳答案
虽然strncmp
可以防止缓冲区溢出,但其主要目的不是为了安全。相反,它存在的情况下,人们希望只比较的第一个N个字符(可能适当的NUL终止)字符串。
从man page开始:strcmp()
函数比较两个字符串s1
和s2
。如果分别找到s1
小于、等于或大于零的整数,则返回小于、等于或大于零的整数。s2
函数类似,只是它比较了strncmp()
和n
中唯一的第一个(最多)字节。
注意,在这种情况下,不能用简单的s1
替换s2
,因为您仍然需要利用它的stop on nul行为,以防其中一个字符串短于strncmp
。
如果memcmp
导致缓冲区溢出,则以下两种情况之一是正确的:
您的数据不应以nul结尾,而应使用n
。
您的数据应该是以nul结尾的,但是当您填充缓冲区时,您已经搞砸了,因为不知怎么的,没有nul结尾它。
请注意,超过缓冲区结尾的读取仍被视为缓冲区溢出。虽然它看起来是无害的,但它也可能和写过去一样危险。
读,写,执行…没关系。对意外地址的任何内存引用都是未定义的行为。在最明显的场景中,您试图访问未映射到进程地址空间的页面,从而导致页面错误,以及随后的sigsegv。在最坏的情况下,有时会遇到一个0字节,但有时会遇到另一个缓冲区,导致程序行为不稳定。
关于c - strcmp怎么了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24353504/