范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

什么,这个C语言大坑你没见过?

  开发过程中,你是否会发出"基础不牢,地动山摇"的感慨,我相信,只要有经验的工程师,应该都有过。
  曾经因为一个很基础的知识,差点毁了整个项目,这不是危言耸听。因为这个代码用于整个系统自检,一旦运行出错,整个系统就废了。
  为了不让别人篡改代码,设计了多套机制,其中一个就是定时检查关键代码是否已执行,如果有一次没有执行,那么系统进入异常状态,这个功能类似窗口看门狗。 uint16_t run_cnt, run_cnt_next;   void function1() {   do something ;   run_cnt++; // 自加,表示该函数已执行 } int main() {   while(1)   {     function1();     if(run_cnt != run_cnt_next + 1) // 判断两个变量是否匹配     {       do error some thing     }     run_cnt_next++; // 这个位置也自加,表示这里已执行   } }
  类似流程如上,当时为了减少变量空间,将计数器设计成了 uint16_t 类型,导致埋下了隐患。
  这个流程乍一看没有问题,因为 run_cnt 比 run_cnt_next 先加,那么 run_cnt_next + 1 应该等于 run_cnt,如果不相等,作错误处理。
  甚至短时间内运行不会有任何问题,除非 16 位溢出……
  所以一个量产项目,任何一点改动,都可能需要长时间的稳定测试,只有这样才能确保系统稳定性,不能认为自己能力强,写的代码不用测试就直接合并了。
  原先鱼鹰以为,这两个变量都是 16 位,那么 + 1 的结果应该也是16 位,最后比较时,也是 16 位比较,这样即使最终 16 位自加溢出了,结果也会是正确的。 if(run_cnt != run_cnt_next + 1) // 判断两个变量是否匹配 {       do error some thing }
  但你以为,终究是你以为。
  实际上,因为你和 1 自加了,最终比较是按照 32 位进行比较,而 run_cnt 受到变量位数限制,始终是 16 位的结果(但扩展成 32 位比较,即高 16 位全是 0)
  这样就会导致在溢出时,两者是不相等的。
  比如上一次 run_cnt 为 0xFFFF 时(受位数限制,最大只能是这个),run_cnt_next 为 0xFFFE,此次结果比较即使按 32 位比较,也是没有问题的,都是 0xFFFF。
  但下一次运行时,run_cnt 自加,溢出变成 0,而 run_cnt_next 是 0xFFFF,再和 1 相加,因为比较会使用 32 位比较,所以此时结果是 0x10000,最终导致两者不相等(0 != 0x10000)。
  那么为什么会导致上面的问题呢?这里涉及到两个 C 语言基础知识点,估计大家以前都了解过,但估计没有当回事。
  1、常量默认为 int 型(但不一定是 32 bit ,和内核和编译器有关,上面的 +1 就是 int 型)
  2、整型提升(详细可网上查找)
  因为两边的结果类型不一致(+ 1 导致右边结果成了 int 类型),所以最终按 int 型处理。最终导致溢出时,结果判断失败。
  我们可以通过汇编看出一些端倪:
  我们可以看到 r0 + 1 之后,直接和 r1 比较,也就是说,结果可能超过 0xFFFF,导致出错。
  那么,怎么样才可以保证结果为 16 位呢?
  我们可以这样处理: if((uint16_t)run_cnt != (uint16_t)(run_cnt_next + 1)) // 强制转化为 16 位比较 {       do error some thing }
  我们可通过汇编发现,多了一条 UXTH 指令,用于把 16 位结果扩展成 32 位(从这里我们也可以得出结论,结果比较总是 32 bit 比较)。
  到此,分析结束,可以看到,为了解释这么一条简单的 C 语言语句,还是挺困难的事情。

1973年,广西舞蹈演员自称毛主席女儿,毛主席得知后我想见见她1973年,远在中南海的毛主席收到了一封信,来信人是广西的一位舞蹈教师,在信件的开头,她亲切地称呼毛主席为爸爸。自认是毛主席的孩子的人还真不少,不过这些人都是打着主席的幌子招摇撞骗ESSASOA智能电动仿生体究竟有没有技术前瞻性?随着社会的进步和时代的变迁,中国早已成为了车轮上的国度,汽车保有量亦是屡创新高。而自从新能源汽车兴起之时,国内汽车行业的电气化进程即刻进入了加速阶段,各式各样的新能源车型也如雨后春数字孪生技术在智慧光伏产业中的应用由于光伏发电是实现双碳战略目标的必要途径,因此近年来我国光伏产业快速发展,对数字化技术的应用和智慧光伏建设的需求也不断增加。我国十四五规划中也提出了要构建新一代信息技术人工智能新能2023年12大AR技术应用发展趋势不止于元宇宙调研机构预计,2028年AR市场规模到将达到977。6亿美元,应用场景遍布元宇宙零售商业游戏医疗等各个领域。密切关注AR技术的应用以了解行业的发展方向至关重要。以下是MobiDev全省住建行业建筑工程算量及计价技术应用职业技能竞赛在湖南城建职院举行闭幕式现场。11月26日,2022年湖南省行业职业技能竞赛全省住建行业(建筑工程算量及计价技术应用)职业技能竞赛在湖南城建职院落下帷幕。省住建厅党组书记副厅长杨爱云,省住建厅党组副国防科技前沿论坛光电技术专场报告会大放光彩,助推光电前沿技术新应用11月25日下午,国防科技前沿论坛光电技术专场报告会在湖南长沙举行。中国工程院刘经南院士出席,中国科学院祝世宁院士中国工程院姜会林院士中国科学院彭练矛院士中国科学院王建宇院士中国科波司登羽绒服毛利率增至63。6,受原材料涨价影响不大波司登羽绒服饰商业零售门店。视觉中国资料图过往三四年以来,总体产品的加价空间已经爬得很高了,未来加价一定会(是在)推出新品类新产品(时)定的价格可能会高一些,但经典款(在)让它升级湖南人到底有多爱读书?编者按从龟甲木椟,到兽皮贝叶线装卷轴,再到电子书籍,知识的呈现形式因时而异。有的知识改变了世界历史,有的知识改变了个人命运,爱读书的湖南人,不仅改变了个人命运,也改变了世界历史。红手表耳机二合一华为WATCHBuds曝光最近一段时间网上流传了出了华为手表耳机的消息,这是华为第一款此类型的手表,从网图可以看出比手表屏幕可以进行上翻,耳机固定在屏幕下方。相信过几天就会见到真容。此前,华为申请了一项类似不可阻挡的步伐写在中华民族伟大复兴的中国梦提出十周年筑梦,一个民族的矢志追寻。逐梦,一个大国的雄健步履。圆梦,一个大党的如磐初心。2012年11月29日,党的十八大闭幕不久,十八届中共中央政治局常委参观国家博物馆复兴之路展览,习近平中国夺冠!乌兹别克斯坦获亚军北京时间11月26日凌晨,2022年世界国际象棋男子团体锦标赛在以色列耶路撒冷结束了决赛的争夺。乌兹别克斯坦队夺得本届男子团体世锦赛亚军。20岁的诺季尔别克雅库博耶夫16岁的扎沃希
民工!(原创)高楼大厦平地起,民工筑楼汗如雨。楼高万丈入云端,为谁辛勤做嫁衣。站在厦端四处观,无限风光尽被占。高楼林立美如画,谁在辛苦谁甜蜜。早出晚归夜即休,腰酸背疼泪眼朦。人人都是父母生,有人且行且珍惜想要体面的生活并不容易,每个光鲜亮丽的背后,都有鲜为人知的心酸,都有难以言说的艰难与委屈。总有眼泪要你自己擦干,总有一段路,需要你独自走过。世界上没有一份工作不辛苦,也没一处人事不天眼早新闻10月20日头条这是一件处处彰显感恩,处处弥漫幸福的特殊礼物!许蕾代表带着它来到北京许蕾代表带到北京的特殊的礼物化屋新貌,这幅村民们一针一线绣出来的苗绣,把整个化屋村一派热热闹闹欣欣向荣的景象为啥人到了50岁,病就增多了?医生建议50岁后,最好多做6件事生活中很多人过了50岁之后,发现发生疾病的几率变大了,动不动就会被检查出疾病,上了一定年纪之后,患上疾病的种类也变多了,感觉自己浑身都是病。为什么到了中老年阶段,身体就大不如以前,特拉斯辞职不到24小时,美俄法3国火速表态,拜登还作出重要承诺在上任仅仅45天后,英国首相特拉斯以有辱使命为由正式宣布辞职。从一开始宣布了1500亿英镑能源计划进行大规模减税改革,到英镑跌至1971年以来最低多名保守党议员请辞,再到推翻几乎所常吃大蒜护肝到底正不正确?如今,大蒜成了越来越多人的心头好,了解大蒜当中的功效和作用的人也变得更多了。大蒜具有消炎杀菌灭毒的功效,无论是生吃还是熟吃,都能够达到消毒杀菌,健脾开胃的效果。中医认为大蒜可以调理逍遥丸可不是妇科专用药,不仅疏肝解郁,可治7种病,男女皆可用说起逍遥丸啊,后面紧跟的都是妇科药,有的地方啊,男同胞去买还不给刷医保,但是你知道吗,无论男女,它还能调理7种症状,建议点赞收藏。第一个呢,就是黄褐斑,也叫做肝斑。黄褐斑啊,和肝脏女乒削球名将首轮出局,田志希31淘汰韩莹,晋级16强挑战陈幸同2022年10月20日,乒乓球澳门冠军赛进入白热化阶段,德国削球名将韩莹首轮出局,成为继杜凯琹后,第二位被淘汰的女单前十,韩国一姐田志希31晋级,挑战国乒世界冠军陈幸同。德国名将韩只用了5场比赛,水货外援就原形毕露!带队1胜4负,离被裁不远了和往年一样,福建队一如既往地输球,本赛季也不例外。揭幕战爆冷击败北京后,他们目前已经吞下四连败。包括今天对阵广州队,以78比109大比分不敌对手。目前,福建男篮场均只能得到84。6英超争四巨变!两大豪门翻车,利物浦重回正轨,纽卡进军BIG6?英超作为全球第一联赛,也作为五大联赛之首,是竞争最为激烈的足球联赛。并且还有许多的豪门位列在此。比如曼联曼城热刺切尔西阿森纳和利物浦是英超传统豪门,也被广大球迷称为英超BIG6。从申京首发或替补对我都没问题我只需更专注地打球直播吧10月20日讯火箭队今日常规赛不敌老鹰队,赛后,火箭中锋申京接受了媒体采访。申京原本被认为会在新赛季担任首发中锋,他季前赛多数时候也是与首发阵容一起出战,但他在常规赛首战仅作