Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
bug
什么样的代码会存在bug和安全隐患呢?
发布于 2020-12-09 17:18:44 浏览:937
订阅该版
[tocm] ### [MSF] 没有释放 **概要** 该程序已分配了堆内存,但未能释放那块内存。 **解释** 分配了堆内存并且分配的内存地址存储在引用(指针)类型的变量里。该堆内存在其生命周期实际结束后从未被释放。然而,其对应的引用仍然指向该内存空间。这可能会导致敏感数据泄漏或意外程序行为(例如拒绝服务)。 **示例** ``` struct S { int *p; }; int main() { int *p; struct S *s; p = malloc(10 * sizeof(int)); // heap memory allocated and pointed to by p if (p == NULL) return 1; s = (struct S*)malloc(sizeof(struct S)); // heap memory allocated and pointed to by s if (s == NULL) { free(p); return 1; } s->p = p; free(s); // only s is freed // s->p, which is copied from p is not freed return 0; } ``` ### [NPD] 空指针解引用 **概要** 该程序正通过有空值的指针访问内存。这可能会导致段错误或不可预测的程序行为。该漏洞与EXP34-C等同 **解释** 在有内存保护的系统里(例如Linux),解引用空指针会导致段错误。 对于嵌入系统来说,它会造成不可预测的程序行为。在Java里,空指针解引用会触发空指针异常。 **示例 - C - 避免** ``` extern int bar(int); int assign(int* a) { int i = bar(*a) // dereference a return i; } int foo(void) { int *p = 0; // p as a pointer has been initialized to 0 (null) assign(p); } ``` ### [AOB] 数组越界 **概要** 该程序正在预期缓存的已声明的界限外(界限之前或之后)访问数据。 **解释** 通常情况下,这会允许攻击者在程序执行期间造成程序崩溃。当代码从其他内存位置读取敏感数据或可疑数据量并假定存在前哨来阻止读操作时(例如字符串里的空值),可能会发生崩溃。预期的前哨可能不位于越界内存里,致使读取过量数据,从而导致段错误或缓存溢出。软件可能修改引用在缓存界限之外的内存位置的索引或执行指针运算。随后的读运算便会产生未定义或意外结果。 **示例 - 避免** ``` int assign(int* a, int i) { return a[i]; /* called by main a only has 2 elements but i is 2 */ } int main() { int a[2] = {0, 1}, b; b = assign(a, 2); // call assign with a and i // a has two elements and i is 2 // a[2] is out-of-bound and also uninitialized printf("value of b = %d\n", b); return 0; } ``` ### [DBF] 资源被多次释放 **概要** 该程序已多次释放了某些资源(例如,堆内存、I/O流对象等)。 **解释** 该程序已多次调用了像free()、close()这样的函数来释放同一个资源对象。这会导致不一致的系统,例如系统的堆管理数据结构或I/O流子类等的损坏。这从而可能允许恶意用户访问任意内存或造成IOException。 **示例 - 避免** ``` int func_1(void *p) { if (p != NULL) { free(p); // free p } } int func_2(void *p) { if (p != NULL) { free(p); // free p } } int main() { int i, *p, *q; p = malloc(10 * sizeof(int)); if (p == NULL) return 1; for (i=0; i < 10; ++i) p[i] = i; q = p; func_1(p); // free p the first time func_2(q); // free p the second time due to value of p copied into q return 0; } ``` ### [DBZ] 被零除 **概要** 该程序正试图将值除以零。 **解释** 当把意外的常数零赋值给除数,或者发生了未适当检测到的错误(例如函数调用的返回值)时,这可能会发生。 **示例** ``` int foo(int a, int guard) { int x = 0; int result = 0; if (guard != 0) result = a / x; // did not check for zero printf("result is %d", result); return 0; } ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
andychen
这家伙很懒,什么也没写!
文章
18
回答
187
被采纳
15
关注TA
发私信
相关文章
1
M5311出现AT response get line failed!
2
可否将LWIP升级到2.1.2 和 2.0.3?
3
signal内核是不是有问题,还是我方法不对
4
关于在stm32F107CVT6中使用以太网芯片DM9161AEP的内存不足异常
5
4.0.1版本的看门狗是不是有bug?
6
workqueue中调用rt_i2c_transfer互斥锁线程bug
7
DMA 串口7 严重BUF反馈
8
rt_event_recv bug
9
小内存管理法里面heap_mem 初始化问题
10
kawaii_mqtt AT使用长时间运行死机的原因分析
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部