【问题标题】:strcat() & strcpy() works even if enough memory is not allocated [duplicate]即使没有分配足够的内存,strcat()和strcpy()也可以工作[重复]
【发布时间】:2014-03-15 01:02:42
【问题描述】:

在实现中缀到后缀的同时,反之亦然算法

我找到了,

char * str = (char*) malloc(1);
strcpy(str,str2);

即使str2 超过 1 个字符(20 个字符或更多),这也有效。

我没有收到任何警告或运行时错误。

这怎么可能?

注意:

我也没有得到垃圾。

无论str2 是什么,我总是得到所需的结果。

【问题讨论】:

  • FWIW,这是许多安全漏洞的根本原因。这就是大多数 C 程序员避免使用这些函数的原因。
  • “我总是得到所需的结果”,嗯总是是很长的时间。在不同的平台、不同的操作系统(或没有操作系统)上尝试相同的代码。代码将 总是得到所需的结果。

标签: c


【解决方案1】:

这个工作的原因是 C 有未经检查的内存访问。 strcpy/strcat 不知道你给它们的指针的另一端有多少内存。他们只是假设您知道自己在做什么,然后去做。

至于为什么你没有看到问题:嗯,他们写入了那个内存。没有什么能阻止他们写超出你分配的内容,所以他们这样做了。所以当你以后看它时,它很好。发生什么了?他们写了别的东西!

可能是他们覆盖了已经分配的其他内容,可能是他们覆盖了未分配的空间,可能是你很幸运,他们覆盖了一些无关紧要的东西。

可能是他们在内部结构上进行了写入,一段时间后您会遇到 malloc 崩溃。

如果你知道你已经以某种方式分配了足够的缓冲区,那么使用这些函数是可以的,但在大多数情况下(特别是如果被复制的东西来自用户),你会想要查看 strncpy.但要小心,粗心的人还有其他陷阱。

【讨论】:

  • 即使strncpy() 并不总是按照人们的想法去做。例如。如果字符串比大小长,它会跳过终止的\0
【解决方案2】:

这就是为什么不建议使用strcatstrcpy 函数的原因。最好使用strncatstrncpy。但是它们在使用前也需要一些注意事项,因为strncpy and strncat is also not safer to use

【讨论】:

  • +1 表示“...使用前的注意事项”。我倾向于使用更有用的自制函数,它在所有情况下都放置 end-\0,并且返回“新”dest 指针而不是原始指针,然后可以进一步使用步骤,废弃 strcat() 的替代品。
  • @glglgl;大多数时候我都这样做:)
  • @glglgl:我倾向于使用一个库函数,它同时为我执行完整的缓冲区管理,使用有效的内存分配策略以及跟踪使用的长度.保留一点元数据,使用正确的算法,事情进展得如此之快真是令人惊讶!
猜你喜欢
  • 2015-09-10
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多