C编写的程序可能产生的主要缺陷

2023-11-13

摘自:软件静态分析工具评析 王 凯,孔祥营

空指针引用、悬空指针、资源泄露、函数返回值、使用未初始化变量、无限循环、死亡代码、缓冲区溢出、野指针等。

1)空指针引用

空指针引用会导致程序崩溃。空指针引用的情况包括:
①忘记对指针为NULL 的情况进行判断;
②虽然对指针是否为NULL 进行了判断,但没能正确处理好。

2)缓冲区溢出

缓冲区溢出是最常见的安全漏洞,包括静态溢出和动态溢出。静态溢出主要指数组或指针的索引为常量情况下的越界,导致内存冲突,给黑客攻击提供了可乘之机,主要包括栈溢出、堆溢出、数据段溢出、BSS 溢出和共享内存溢出;动态溢出主要是数组或指针的索引在动态访问内存的时候越界,由于C 语言固有的不安全性,数组或指针的索引不会自动去做边界检查,因此缓冲区溢出的情况非常普遍,所以程序员在用C 语言编写代码时有必要检查索引是否在有效区
间内,但在复杂的函数调用和数据流传递中,这项工作变得异常复杂。

3)悬空指针

悬空指针是由于使用了已经释放的内存资源造成的。引用已释放的指针是非常危险的,因为指针的值不确定或者指针指向任意内存的位置。为了避免悬空指针,必须在最后的引用释放后再删除对象。

4)资源泄漏

资源泄漏是程序离开了指针的作用域后,仍没有释放指针占用的资源造成的。资源泄漏包括内存泄漏、文件句柄泄漏和网络套接字泄漏。
严重的内存泄漏能导致进程崩溃,即便是很小的内存泄漏,在系统长时间运行没有重启后,也会产生错误。文件句柄或者网络套接字的泄漏会导致程序崩溃、拒绝服务攻击或者打开其他文件或套接字失败。操作系统通常会限制进程的文件句柄和套接字个数。当达到限制的最大值时,进程要申请新的资源时,首先要关闭一些已打开的资源。如果进程中存在资源泄
漏,进程自己将没有办法回收这些资源,除非强行终止该进程。
多数情况下,这些泄漏通常发生在某个错误的路径,比如说,某个异常处理的分支。这种情况下,正确的做法应该是将程序跳转到该函数的出口,出口处应释放这些资源。

5)函数返回值

函数返回值错误主要包括函数遗漏返回值和函数返回值可能为空或为局部变量的地址或为负整数。函数返回值使用前,一定对其值进行判断。如果为空,对其非法引用将会导致程序崩溃;如果为负整数,在作为数组索引、循环标志变量、申请内存大小的参数等情况下要检查函数返回值的正确性,负整数的错误使用会导致如死循环、数组越界(内存冲突)、变量溢出等严重的问题;如果是局部变量的地址,在C 语言中,当被调用函数执行完毕,其所有的局部变量就
不再有效,因此将会引起内存冲突和不确定的行为;在返回类型为非void 的函数中,值没有被返回,比较常见的情况是,在不同的分支要返回不同的值,结果有一个分支漏了返回值。

6)使用未初始化变量

变量在使用前没有初始化。堆栈中的变量如果没有初始化,将没有固定的数值。使用了没有初始化的变量会导致不可预测的行为,或安全漏洞。

7)无限循环

程序中有不能终止的循环,会导致程序挂起或者崩溃。当然在多任务的程序中,故意设计的“死循环”除外。

8)不可达代码

由于条件判断总是TRUE 或FALSE,导致一个分支内的代码永远执行不到,这些永远都执行不到的代码称为不可达代码。不可达代码一般是由逻辑错误引起的。在情况严重时,这些逻辑错误可能导致重要的代码永远不能执行,造成严重的后果。

9)野指针

野指针不是NULL 指针,是指向“垃圾”内存的指针。产生野指针主要有两个方面的原因:
①指针变量未被初始化。任何指针刚创建时不会自动成为NNLL 指针,而是随机的,它会乱指一气。故指针创建时应当初始化,要么将指针设置为NULL,要么让它指向合法的内存。
②指针p 被free 或delete 后,没有设置为NULL。这样让人误以为p 是合法的指针,其实free 或delete仅把p 所指向的内存释放掉,但并没把指针p 本身释放(仍指向原来的地址)。通常用if(p!=NULL)进行防错处理,但是很遗憾,此if 语句根本起不到防错的作用,因为即使p 不是NULL,它也不指向合法的内存块。
另外不要将指针或引用指向栈内存,因为栈内存
在函数结束时会被释放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C编写的程序可能产生的主要缺陷 的相关文章

  • linux桌面远程控制,在LINUX下远程控制WIN桌面

    rdesktop 是个在veket下访问视窗系统 远程桌面的客户端程式 当前 rdesktop 所支持的 视窗系统 系列版本包括 NT 2000 XP 和2003 通过使用 rdesktop 所实现的远程桌面协议 RDP 你能在veket系
  • 企业微信群机器人开发

    准备工作 已经注册了有效的企业微信账号 并且在客户端上已经登录 现有或者新建有效的包含多名企业微信成员的群聊 创建群聊机器人 右键群聊 gt 管理聊天信息 gt 添加群机器人 使用群机器人 在终端某个群组添加机器人之后 创建者可以在机器人详
  • 【单片机笔记】STM32+ESP8266通过AT指令WIFI连接阿里云MQTT服务器

    上一篇使用USB转串口的方式通过ESP8266wifi模块的方式成功连接上了阿里云 现在就要通过单片机来替换电脑上位机了 这样单片机自动的去调用并发送串口数据更加方便 也更加符合一个产品的开发 板载的传感器有NTC温度 光强 这两个主要用来
  • 音频采样率、采样深度、占用字节数浅析

    1 从一个问题来看 16K采样率 16bit采样深度 20ms的数据共占用多少字节 想要解这个问题 首先就要明白采样率是什么 它的单位是什么 采样率 就是指音频在每秒的采样次数 采样多少个点 单位是赫兹 hz 在这里 尤其不要与比特率 bp
  • wxc-icon使用

  • Vue3中的computed函数详解

    计算属性是Vue中常用的一种方式 主要用于在模板中放置逻辑计算 方便开发者进行数据操作和展示 在Vue3中 计算属性依然是非常重要的一种功能 而computed函数则更加的方便计算属性的使用 本文将对Vue3中的computed函数进行详细
  • 修改约束(注意是否存在字段名的情况)

    添加字段名时添加约束 语法 alter table 表名 add 字段名 数据类型 约束名 注意 这个方法会让表中让所有address都变成 中国 表达有点不清晰 自己去试试此方法和其他方法就知道了 例如 alter table emp a
  • 汇编语言笔记-ARM架构基本寄存器

    文章目录 寄存器组 1 R0 R12 2 R13 3 R14 4 R15 特殊寄存器 程序状态寄存器 xPSR 中断 异常屏蔽寄存器 CONTROL寄存器 浮点寄存器 1 S0 S31和D0 D15 浮点状态和控制寄存器 FPSCR 浮点单
  • 玩转ChatGPT:Excel操作初探

    一 写在前面 首先还是让小Chat推销下自己 Excel 表格制作是个技术活 你掌握了吗 没关系 现在有了 ChatGPT 让 Excel 辅助操作变得更简单 再也不用苦恼于数据分析和整理了 让 ChatGPT 成为你的数据处理助手 让 E
  • FISCO BCOS 区块链应用(五)结合WeBase开发区块链目录管理系统

    目录 前提条件及说明 1 1 搭建Fisco Bcos区块链底层平台 1 2 搭建java项目并引入 web3sdk 1 3 搭建WeBase区块链管理平台 应用开发 1合约设计 2代码实现 3合约编译 4 java SDK集成 应用端对接
  • linux系统 <linux/fs.h>头文件查找

    起因 因为在做模块实验时要对register chrdev函数绘画流程图 于是我就想着去找找看到底这个函数在哪 首先根据这个笔记来看 Linux内核API register chrdev 极客笔记 deepinout com 应该在linu
  • CJson-修改浮点数的位数

    现状 调用cJSON Print 将组成的json转为字符串格式时 对于浮点数的位数是不固定的 length sprintf char number buffer 1 15g d 源代码里用的是 1 15g 代表输出字符最少一位 最大15位
  • 【技术方案】springboot全局异常处理方式

    springboot全局异常处理方式 springboot全局异常有两种处理方式 第一种方案 继承DefaultErrorAttributes类 重写getErrorAttributes方法 代码如下 Slf4j RestControlle
  • SyntaxError: missing ) after argument list

    消息 语法错误 参数列表后面缺少 错误类型 SyntaxError 什么地方出错了 有一个函数在调用时出现错误 这可能是一个错误 丢失运算符或者转义字符等 示例 因为没有使用 操作符来连接字符串 JavaScript 认为 log 函数的参
  • Java 解析http返回的xml数据

    Java 解析http返回的xml数据 写成txt文件 需求 每小时抓取给定api接口返回的xml数据 把xml数据保存为XML文件 把xml数据转换txt文件格式数据 保存txt文件 文件名以yyyyMMddHH0000 txt和yyyy
  • FileZilla_Server快速搭建FTP服务器

    文档目的 介绍如何使用FileZilla Server软件在windows server服务器上搭建FTP服务器 注意 如果需要这个具及这个工具的视频操作教程 请点击 此处 下载 文档目的 介绍如何使用FileZilla Server软件在
  • CV第一篇:EDLines基础理论

    EDLines A real time line segment detector with a false detection control 简介 图像信息特征的描述大致分为角点特征 线特征和语义特征 点特征如harris sfit s
  • 关于C++ new和malloc的区别!

    一 前言 new和malloc的知识点 他们之间的关系 有什么异同 作为一个C 工程师是必须要了解清楚 在面试中该知识点也是经常会被问到的 所以在此文章 总结下new和malloc的区别到底在哪里 二 new和malloc两者的区别 2 1
  • java项目域名访问失败但IP访问正常

    1 域名访问失败但通过IP访问正常 发生此类型情况可能的原因如下 DNS 解析问题 域名访问失败可能是因为 DNS 解析出现了问题 导致域名无法解析成正确的 IP 地址 可以通过使用 nslookup 或 dig 命令来检查 DNS 解析是

随机推荐

  • 四种线程池拒绝策略

    一 前言 线程池 相信很多人都有用过 没用过相信的也有学习过 但是 线程池的拒绝策略 相信知道的人会少许多 二 四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时 如果还有任务到来就会采
  • 墨者-SQL注入漏洞测试(报错盲注)

    墨者 SQL注入漏洞测试 前言 一 sqlmap 二 手注 1 报错注入 2 时间注入 3 联合查询union被过滤 总结 前言 本题为墨者学院在线靶场 进入题目发现是个登录界面 找了好久 最后在关于平台停机维护的通知的页面找到了注入点 判
  • Acwing 892. 台阶-Nim游戏

    此时我们需要将奇数台阶看做一个经典的Nim游戏 如果先手时奇数台阶上的值的异或值为0 则先手必败 反之必胜 证明 先手时 如果奇数台阶异或非0 根据经典Nim游戏 先手总有一种方式使奇数台阶异或为0 于是先手留了奇数台阶异或为0的状态给后手
  • (代码练习)1~100中出现数字9的个数---C语言

    出现9的数字有哪些 出现整十之前的数字就是含有9的数字 所以方法一 打印整十前面的数 运行结果 这种方法显得不够专业 而且漏掉了90及其以后十位为9的数 下面介绍方法二 思路 给一个循环从1遍历到100 拿到每个数据后进行一下操作 a 通过
  • MySQL-分库分表详解(三)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 前言
  • 手动加载logback配置文件

    前言 自己写了个压测的main方法 这里主要介绍如果在main方法中输出logback日志 正文 import java io File import java io IOException import org slf4j LoggerF
  • 网站报错 :SLQSTATE[HY000]:General error:145 Table ‘./**@002******@/002ecn/ey_config‘ is mar

    后台使用过程中 因为某个操作而出现报错 SQLSTATE HY000 General error 145 Table 002 002ecn ey config is marked as crashed and should be repai
  • 《Linux运维实战:Centos7.6一键离线部署docker19.03.9》

    文章目录 一 部署背景 三 部署工具 三 部署演示 总结 整理不易 如果对你有帮助 可否点赞关注一下 一 部署背景 由于业务系统的特殊性 我们需要面向不通的客户安装我们的业务系统 而作为基础组件中的docker针对不同的客户环境需要多次部署
  • 通过docker搭建skywalking

    简述 这里引用skywalking官方网站上简介 分布式系统的应用程序性能监视工具 专为微服务 云原生架构和基于容器 Docker K8s Mesos 架构而设计 SkyWalking 是观察性分析平台和应用性能管理系统 提供分布式追踪 服
  • IPO 后,北森不断超越自身

    北森锐意变革的思路值得很多行业借鉴 数科星球原创 作者丨苑晶 编辑丨大兔 在所有 HR SaaS 软件中 北森较为独特 这种独特不光体现在其切入赛道的一体化产品 也体现在它所走过的发展路径 2023 年年中 当人口红利消逝之际 人们对人力资
  • 面试题_Java源文件中可以有多个类,为什么只能有一个public类?

    Java中源文件中可以有多个类 最多只能有一个public类 如果源文件中有多个类 那么只能有一个类是public类 如果有一个类是public类 那么源文件的名字必须和这个类的名字完全相同 扩展名为 java java程序的入口是main
  • 计算机网络——数据链路层の选择题整理

    数据链路层的功能 1 数据链路层协议的功能不包括 A 定义数据格式 B 提供结点之间的可靠传输 C 控制对物理传输介质的访问 D 为终端结点隐蔽物理传输的细节 解析 选D 对于A 定义数据格式 即采用帧作为传输单元 对于B 提供结点之间的可
  • 安卓开发之前端

    安卓开发之前端界面的搭建 前段时间因为网络编程这门课要做一个课程project 题目是本地服务器的开发 需要开发一个安卓客户端 于是就把去年小学期学的那点安卓知识捡起来了 心累 想到去年小学期学的那点安卓真的不算什么 就是一些很简单的东西
  • windgb调试

    reference http hi baidu com lewutian blog item 191047882b9c399fa5c27261 html 调试前的必备工作 在开始调试前首先要做的工作是设置好符号 Symbols 路径 没有符
  • C++constexpr函数(常量表达式函数)

    1 语法 在定义函数时用constexpr关键字作为前缀修饰函数 如 constexpr int fun return 20 注意 定义了一个constexpr函数后 函数声明也要加上constexpr关键字 constexpr函数只能有一
  • 如何安装svelte_在Svelte JS中使用环境变量

    如何安装svelte Process is not defined the compiler just slapped you in the face again You are tempted to hardcode your envir
  • 使用 PyTorch C++ 前端

    PyTorch C 前端是 PyTorch 机器学习框架的纯 C 接口 虽然 PyTorch 的主要接口是 Python 但 Python API 位于大量 C 代码库之上 提供基础数据结构和功能 例如张量和自动微分 C 前端公开了一个纯
  • linux查看系统中文件的内存占用以及具体某个文件夹下内存占用

    1 linux查看系统文件内存占用 df hl 2 Linux查看某个具体文件夹下文件的内存占用 du sh
  • SpringCloud——网关Gateway

    文章目录 六 统一网关 Gateway 6 1 网关介绍 6 2 快速搭建网关 6 3 断言工厂 6 4 过滤器工厂 6 5 全局过滤器 GlobalFIlter 6 6 过滤器的执行顺序 6 7 跨域问题 六 统一网关 Gateway 6
  • C编写的程序可能产生的主要缺陷

    摘自 软件静态分析工具评析 王 凯 孔祥营 空指针引用 悬空指针 资源泄露 函数返回值 使用未初始化变量 无限循环 死亡代码 缓冲区溢出 野指针等 1 空指针引用 空指针引用会导致程序崩溃 空指针引用的情况包括 忘记对指针为NULL 的情况