内存溢出、内存泄漏、内存越界

内存溢出:程序在申请内存时,系统没有足够的内存空间供其使用。

内存泄露:向系统申请内存使用完后没有归还,导致有效内存被占用。内存泄露最终会导致内存溢出。例如:new一块内存使用,使用完后没有delete。

内存越界:向系统申请一块内存后,使用时超出了内存申请范围。例如:通过下标取数组元素时,下标过大导致越界。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Klocwork 介绍 Klocwork - 源代码缺陷自动分析工具概述:Klocwork 软件是 Klocwork 公司基于专利技术分析引擎开发的,综合应用了多种近年来 最先进的静态分析技术,是出色的软件静态分析软件。Klocwork 产品与其它同类产品相比, 具有很多突出的特征:Klocwork 支持的语言种类多,能够分析 C、C++和 Java 代码;能够发 现的软件缺陷种类全面,既包括软件质量缺陷,又包括安全漏洞方面的缺陷,还可以分析对软 件架构、编程规则的违反情况;软件分析功能全面,既能分析软件的缺陷,又能进行可视化的 架构分析、优化;能够分析软件的各种度量;能够提供与多种主流 IDE 开发环境的集成;能 够分析超大型软件(上千万代码行)。主要功能: 缺陷检测提供多角度的各种缺陷类型的分析。自动化的缺陷检测功能易于使用,定制灵活,具有图 形化的构建和报表管理图形界面,拥有业界领先的消息过滤器,极具柔性的配置,和强大的学 习调整知识库;Klocwork 能够分析 C/C++和 Java 代码,生成代码问题报告,能够发现的缺陷 类型举例。(详细参见附录): C/C++缺陷类型样例 空指针释放 内存管理问题(如:内存泄漏) 数组越界 未初始化数据使用 编码风格问题(如:在条件中赋值) Java 缺陷类型样例 效率错误(如:空的 finalize 方法) 可维护性问题(如:空的 catch 从句) 可靠性问题(如资源泄漏) 安全漏洞检测Klocwork 确信软件安全性是软件质量中一个重要的、并越来越受重视的方面。同样的, 所有的 Klocwork 安全漏洞分析是基于市场领先的缺陷检测能力,从原来的缺陷检测分离出来 单独的安全漏洞检测和违反推荐的安全代码最佳实践的缺陷检测。 能够检测到的安全漏洞类型 举例(详细参见附录) C/C++安全漏洞分类 访问控制缺陷 缓冲区溢出 DNS 欺骗 忽略返回值 注入缺陷 不安全的存储 未经验证的用户输入 Java 安全漏洞分类 拒绝服务 注入缺陷(如:SQL 注入、进程注入等) 未经验证的输入 移动代码安全 有漏洞的会话管理 跨站点脚本 出错处理不当
序号 检查点描述 补充说明 1 变量初始化检查 结构变量初始化时,是否初始化完全 局部、全局常量应在定义位置初始化 局部变量使用前必须初始化 2 循环边界检查 循环体若存在数组,确认数组下标不越界 循环是否存在死循环的可能 循环计数器是否存在多循环(+/-)1次可能 3 数组下标检查 循环体内、体外时的数组下标计算是否正确 宏定义包含数组操作时下标是否正确 拷贝时数组下标是否越界 4 显式表达运算符优先级 5 条件预处理 预处理开始和结束点是否匹配 多个预处理同时存在时,匹配逻辑是否正确 6 变量强制转换 是否存在高精度数据向低精度数据转换 是否存在指针类型转换,内存长度是否匹配 7 布尔逻辑判断方式 非真判断是否存在纰漏如 !true 逻辑判断是否准确 8 循环体内break、continue、goto导致的数据流向问题 9 宏的正确使用 宏命名是否能望名知义 宏的入参有效性检查是否充分 10 函数返回值、返回类型 返回逻辑正确性,如FAILURE/FALSE的区别 异常分支的返回值、错误码是否正确 返回类型是否匹配 11 局部变量作用域 是否存在返回局部变量指针 局部变量指针是否赋值给全局指针 12 函数参数调用 入参和定义是否一致。特别关注多重指针和单重指针的相互转换 参数类型是否一致,防止入参数据被截短 13 入参安全检查 是否确认入参的有效性范围 全局指针使用前是否进行了判断 14 内存泄漏 正常分支下,是否释放了动态内存 异常分支下,是否释放了动态内存 内存释放是否完整,譬如多重指针的释放 15 内存越界读写 循环体内的指针读写是否存在越界 内存拷贝操作是否存在指针越界 16 内存释放安全 内存释放后,内存指针是否已赋空 是否存在重复释放的可能 是否释放内存的指针已经发生偏移 17 缓冲区溢出安全问题检查 是否存在诸如 strcpy/strcat/scanf 此类高危险性缓冲区溢出函数,使用是否存在问题。 字符串操作函数的长度计算必须确保正确 注意空字符结束的函数,如strncat,有时会自动在内存后面添加’\0’,此时是否可能造成内存越界
Linux中的堆是用于动态分配内存的一块区域,用于存储程序运行时的动态数据。堆内存越界指的是在堆内存分配的区域之外进行读写操作。 堆内存越界可能导致以下问题: 1. 数据损坏:当在堆内存分配区域之外进行写操作时,可能会覆盖掉其他程序使用的内存,导致数据的损坏。这可能导致程序运行不正常或崩溃。 2. 安全问题:恶意用户可以利用堆内存越界来修改其他程序的内存数据,实施攻击,例如缓冲区溢出攻击。这可能导致系统的安全漏洞和数据泄露。 3. 内存泄漏:当在堆内存分配之外进行读操作时,程序可能会访问到未分配的内存区域,造成内存泄漏。这些未分配的内存无法被释放,导致内存占用过多,最终导致系统性能下降。 为了避免堆内存越界问题,可以采取以下措施: 1. 使用堆内存分配函数:在使用堆内存时,应该使用操作系统提供的堆内存分配函数(例如malloc或new),这样可以确保内存的正确分配和释放。 2. 控制内存访问范围:在编程过程中,应该严格控制对堆内存的访问范围,确保不会越界访问。 3. 使用工具进行检测:可以使用一些工具(例如Valgrind)来检测内存越界的问题,这些工具可以提供详细的报告和警告,帮助开发人员发现和修复问题。 总之,堆内存越界是一种常见的程序错误,可能导致程序崩溃、数据损坏和安全漏洞。开发人员应该注意编写安全的代码,并采取相关措施来避免和修复堆内存越界问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值