当前位置: 首页 > news >正文

C程序中隐藏的数据溢出陷阱

C程序中隐藏的数据溢出陷阱
通常的规则: 当代码中对char、short等更短的类型进行算术运算时,编译器会自动将它们提升为int再进行计算。

假设16位、32位无符号数类型,分别定义为UINT16、UNIT32


一.计算过程溢出


对16bit机器,如以下程序
UINT16 a, b, c;
c = (a * b)/10;
故障描述:当a=6554,b = 10,但c出错,(6554*10)/10 != 6554;
原因分析:a * b = 65540,按unsigned int为16bit计算已溢出;
解决方案:c = ((UNIT32)a * b)/10; //手动提升a到32bit


二.移植后溢出


1. 16位机器,正常运行



设计如下程序, 在主循环中运行10次,处理某件事1次
UINT16 a=0, a0=0;

a++;//记录运行次数,a达到0xffff后+1溢出为0
if((a-a0) >= 10)
{
a0 = a;//记录当前时刻
//处理其它逻辑
}

当a0=65530,a=4(a当前65530,经过10次运行,变成4,)时处理事情
在程序中,UINT16就是本机字长,直接处理不提升,那么a-a0 = 4-65530 = −65526 = 10(在无符号整数运算中,结果的溢出遵循模2的16次方回绕规则)



2. 移植到32位机器,不能正常运行



故障描述:在a++溢出返回0后,程序异常;
原因分析:(a-a0)提升为32位有符号数int,−65526在范围内不会转换,-65526 >= 10不成立;
解决方案:if((UNIT16)(a-a0) >= 10)

http://www.jsqmd.com/news/490806/

相关文章:

  • SmallThinker-3B-Preview效果惊艳:支持多跳推理的复杂因果关系分析实例
  • Gemini 3深度量化分析:Google的万亿参数巨兽到底有多强?
  • Tabularis:一款面向开发者的轻量级数据库管理工具
  • File的用法
  • LLM大规模数据的组织检索方法
  • 30款IDEA插件宝贝,开发效率yyds!
  • 基于博途V16的程序:传送带机械手工件搬运监控系统
  • HAC集群切换后断档问题处理
  • GPT-5.4 深夜上线!百万上下文+原生操作电脑,OpenClaw 天选模型来了!【附GPT升级教程】
  • Matplotlib绘制拆线图自定义曲线颜色显示
  • JAVA今日面经(一)
  • 发电机组并网技术研究
  • 工业物联网百科全书
  • 立创开源广场自动签到脚本V1.1
  • KMP算法之 next 数组的计算
  • 净水器行业的下一步:从卖设备到卖服务
  • 「OpenClaw 实战全攻略」:从打造 Second Brain 到服务器自愈,20+ 真实落地场景解析
  • 欧洲十家运营商联手对抗星链:一场关于天空的“地缘保卫战”
  • 第六讲:OpenClaw+Deepseek+飞书低成本安装龙虾指南(最新)
  • SceneV:基于Vue3与ThingsBoard的高性能低代码组态可视化解决方案
  • 底部填充胶 (Underfill) 怎么选?AI 算力芯片与 CoWoS 先进封装导热用胶白皮书—37W/m·K 高导热与 13ppm 极低 CTE :峻茂芯片级应力管理指南
  • 高级java每日一道面试题-2025年8月27日-基础篇[LangChain4j]-如何审计 LLM 的输入输出?
  • 2025_NIPS_Transformer brain encoders explain human high-level visual responses
  • Select、Poll、Epoll详解:核心区别与实战用法
  • coding plan vs token
  • 高级java每日一道面试题-2025年8月28日-业务篇[LangChain4j]-如何使用 LangChain4j 实现智能投研助手?需要处理哪些金融数据源?
  • LeetCode Hot100(66/100)——118. 杨辉三角
  • Qt进程间通信
  • LeetCode Hot100(68/100)——198. 打家劫舍
  • 【LLM进阶-Agent】13.function call vs mcp vs skills