请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 122|回复: 0

尽量减少使用 _alloca 和可变长度数组

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-10 14:31:33 | 显示全部楼层 |阅读模式
_alloca 和可变长度数组使用的内存量在编译期间不可知。尤其是在循环中使用时,根据编译器的实现不同,可能会导致:(1)栈溢出,即拒绝服务; (2)缺少栈内存测试的编译器实现可能导致申请到非栈内存,并导致内存损坏。这在栈比较小的程序上,例如IoT设备固件上影响尤为大。对于 C++,可变长度数组也属于非标准扩展,在代码规范中禁止使用。

错误示例:
  1. // Bad
  2. for (int i = 0; i < 100000; i++) {
  3.   char* foo = (char *)_alloca(0x10000);
  4.   ..do something with foo ..;
  5. }

  6. void Foo(int size) {
  7.   char msg[size]; // 不可控的栈溢出风险!
  8. }
复制代码


正确示例:
  1. // Good
  2. // 改用动态分配的堆内存
  3. for (int i = 0; i < 100000; i++) {
  4.   char * foo = (char *)malloc(0x10000);
  5.   ..do something with foo ..;
  6.   if (foo_is_no_longer_needed) {
  7.     free(foo);
  8.     foo = NULL;
  9.   }
  10. }

  11. void Foo(int size) {
  12.   std::string msg(size, '\0');  // C++
  13.   char* msg = malloc(size);  // C
  14. }
复制代码



关联漏洞:

  1.   低风险-拒绝服务

  2.   高风险-内存破坏
复制代码
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 08:16 , Processed in 0.089383 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表