strcmp怎么了?

戴维·卡里

在应对这个问题读一个字符串,然后比较它命名为c,不止一个人劝阻使用的strcmp(),说这样的话

我也强烈建议您现在就习惯使用strncmp(),以避免将来出现许多问题。

或(为什么我的字符串比较失败?

确保您使用的是strncmp而不是strcmp。strcmp非常不安全。

他们暗示什么问题?

强烈建议不要scanf()使用字符串说明符原因是它们几乎不可避免地导致缓冲区溢出漏洞。但是,不可能用来使缓冲区溢出,对吗?gets()strcmp()

“缓冲区溢出或缓冲区溢出是一种异常,其中程序在将数据写入缓冲区时会超出缓冲区边界并覆盖相邻的内存。”

(-维基百科:缓冲区溢出)。

由于strcmp()函数从不写入任何缓冲区,因此strcmp()函数不会导致缓冲区溢出,对吗?

人们不鼓励使用而是strcmp()推荐的原因是什么strncmp()

乔纳森·莱因哈特

虽然strncmp可以防止您溢出缓冲区,但缓冲区的主要目的不是出于安全考虑相反,它存在,其中一个要比较只有一个(的前N个字符的情况下适当地可能NUL终止)的字符串。

手册页

strcmp()函数比较两个字符串s1s2如果s1分别发现小于,匹配或大于,则返回小于,等于或大于零的整数s2

strncmp()功能是相似的,除了它比较仅第一(至多)n的字节s1s2

请注意,strncmp在这种情况下不能用简单的替换memcmp,因为如果其中一个字符串短于,您仍需要利用其NUL停止行为n

如果strcmp导致缓冲区溢出,则满足以下两个条件之一:

  1. 您的数据不应以NUL结尾,您应该使用它memcmp
  2. 你的数据预期为NULL结尾的,但你已经搞砸了,当你填入缓冲区,通过某种方式不NUL终止它。

注意,超过缓冲区末尾的读取仍然被认为是缓冲区溢出尽管它看起来无害,但与写到最后一样危险

读,写,执行...没关系。任何对意外地址的内存引用都是未定义的行为。在最明显的情况下,您尝试访问未映射到您进程的地址空间中的页面,从而导致页面错误以及随后的SIGSEGV。在最坏的情况下,有时会遇到\ 0字节,但有时会遇到其他缓冲区,从而导致程序行为不稳定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章