在应对这个问题读一个字符串,然后比较它命名为c,不止一个人劝阻使用的strcmp()
,说这样的话
我也强烈建议您现在就习惯使用strncmp(),以避免将来出现许多问题。
确保您使用的是strncmp而不是strcmp。strcmp非常不安全。
他们暗示什么问题?
强烈建议不要scanf()
使用字符串说明符,原因是它们几乎不可避免地导致缓冲区溢出漏洞。但是,不可能用来使缓冲区溢出,对吗?gets()
strcmp()
“缓冲区溢出或缓冲区溢出是一种异常,其中程序在将数据写入缓冲区时会超出缓冲区边界并覆盖相邻的内存。”
(-维基百科:缓冲区溢出)。
由于strcmp()函数从不写入任何缓冲区,因此strcmp()函数不会导致缓冲区溢出,对吗?
人们不鼓励使用而是strcmp()
推荐的原因是什么strncmp()
?
虽然strncmp
可以防止您溢出缓冲区,但缓冲区的主要目的不是出于安全考虑。相反,它存在,其中一个要比较只有一个(的前N个字符的情况下适当地可能NUL终止)的字符串。
从手册页:
该
strcmp()
函数比较两个字符串s1
和s2
。如果s1
分别发现小于,匹配或大于,则返回小于,等于或大于零的整数s2
。的
strncmp()
功能是相似的,除了它比较仅第一(至多)n
的字节s1
和s2
。
请注意,strncmp
在这种情况下不能用简单的替换memcmp
,因为如果其中一个字符串短于,您仍需要利用其NUL停止行为n
。
如果strcmp
导致缓冲区溢出,则满足以下两个条件之一:
memcmp
。注意,超过缓冲区末尾的读取仍然被认为是缓冲区溢出。尽管它看起来无害,但与写到最后一样危险。
读,写,执行...没关系。任何对意外地址的内存引用都是未定义的行为。在最明显的情况下,您尝试访问未映射到您进程的地址空间中的页面,从而导致页面错误以及随后的SIGSEGV。在最坏的情况下,有时会遇到\ 0字节,但有时会遇到其他缓冲区,从而导致程序行为不稳定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句