当你怀疑电脑的时候,就是该换个方法的时候了

news2024/11/18 5:57:03

做软件开发的朋友们,干的时间长了,相信都会有过类似的体验:一个问题查了很久很久,代码检查了很多遍很多遍,到最后都要怀疑电脑了,突然发现是一个特别隐蔽的错误导致的,而这种错误通常不涉及逻辑流程,却特别容易瞒天过海。比如可能是掺杂了一个中文字符,可能是少写了一个分号,可能是变量重名了,可能是类型强转了,可能是变量未初始化,可能是指针指错了等等等等。反正都是一些不引人注意的细节导致了问题的难缠。今天,博主就遇到了一个类似的问题。

在正式开始之前,简单介绍一下背景。其实这个问题并不复杂,之所以难缠,反倒是环境导致的。博主需要在一个双核CPU上分别实现不同的功能。因为各种原因,导致只能通过CPU0来访问调试。如果要调试CPU1上的程序,那么将相关量写入共享内存,然后通过CPU0读出,以此间接调测。

因为这种方式比较麻烦,所以要调试CPU1的时候,内心总是抗拒的。尤其是当在CPU1中已经增加不少的调试变量后,更加的抗拒新增调测变量。但是,上天总是公平的,一份付出一分收获,自认为没有问题而不愿意调测的代码,执行时往往隐含着神秘的错误。所以,让代码可测,确实是有道理的。

关于这方面,其实已经有很多好的经验了。比如,典型的测试驱动开发,就让代码的可测性可控性大大增强了。但是偷懒是人的本性。虽然说懒是促进人类进步的动力,但那是另一种“懒”,而非这里所说的真的懒。很多时候,我们都是懒得写测试代码,而是直达目的,而且是边想边写,边写边测,缺少设计、规划。为此,很多资深开发者,实力前辈通过各种渠道倡议了许多好用的软件工程方法,包括前面的测试驱动开发,包括敏捷开发,包括重构等等。但是(我们已经讲了很多但是了),具体到开发实践中,正真能够落实的又有多少呢?往往都是入坑了,才慨叹悔不当初啊。所以,经过此次入坑的经验教训,博主也是更加坚定了坚持写测试用例来验证代码逻辑的做法。俗话说磨刀不误砍柴工,这才是比解决问题本身更大的收获。

好了,现在我们具体看看是个什么问题。

我们先看看代码。将关键部分提取出来,整理如下:

#include "stdio.h"

static int state = 0;

int get_state() {

   state = 2;

   return state;

}

int main(int argc, char **argv)

{

   int cur_state = 1;

   if (get_state > cur_state) {

      printf("state changed \n");

   }

   return 0;

}

不知大家看出啥了没有。我们编译看看。

编译提示如下:

可以看到,编译有一个警告。当然,这里可以清晰的看到该警告,但是在工程中,一旦有很多警告被忽略的话,那这种警告也就当做不存在了。

我们执行代码,看看效果:

If条件被执行了。在工程中,这种情况可能还不会触发问题。我们修改一些代码,再看看。

这次,我们把状态改成3,如果是函数的话,2大于3就不成立了,但是可以看到,if条件仍然被执行了。

其实这个问题的原因很简单,我们在编写代码过程中,出现了拼写错误,丢失了函数的括弧,编译器将函数名当做函数指针,用一个指针值参与运算了。自然,条件会始终执行。要想让if条件不执行,在不动函数拼写错误的情况下,就需要将变量值改为很大的值才行。我们也顺便验证一下:

可以看到,符合我们的预期。

这种错误,一般是代码编辑工具自动联想时导致的。如果在大工程中出现,还是很隐蔽的,如果存在于一个犄角旮旯的地方,那测出的概率就小,隐患就大。

好了,总结一下,有两点:一,俗话说的不听老人言,吃亏在眼前还是很有道理的。二,由怀疑程序到怀疑电脑推而广之,当你怀疑人生的时候,就该考虑换个活法了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021第十二届蓝桥杯Python组国赛【真题+解析+代码】

🎁2021第十二届蓝桥杯python组国赛真题 🚀 真题练习,冲刺国赛 🚀 2021第十二届蓝桥杯python组国赛真题解析代码 博观而约取,厚积而薄发 🏆国赛真题目录 文章目录 🎁2021第十二届蓝桥杯python组国…

chatgpt赋能python:Python创建一个3x3的数组

Python创建一个3x3的数组 如果您是一名Python的爱好者或是初学者,在处理数据的时候一定会遇到需要创建数组的情况。在本篇文章中,我们将会介绍如何使用Python创建一个3x3的数组。在这个过程中,我们将从定义数组开始,到最后输出结…

【Python】函数 ⑥ ( 变量作用域 | 局部变量 | 全局变量 | global 关键字 | 代码示例 )

文章目录 一、变量作用域1、局部变量2、全局变量3、代码示例 - 函数体内修改全局变量失败4、代码示例 - 函数体内修改全局变量 一、变量作用域 Python 变量 作用域 是 变量的 使用范围 , 变量 在哪些 代码区域中可以被访问 , 在哪些代码块中不能被访问 ; 变量主要分为两类 : 局…

国产化麒麟系统在window系统上用hyper-v搭建虚拟机环境QT安装文件传输步骤

1 麒麟系统国产化hyper-v虚拟机环境经验 1.1 简介 随着国际环境的变化,软硬件国产化是现在迫切的需求,只有实现了自主研发,才能自立自强,才能实现民族伟大复兴,才能实现祖国的繁荣昌盛。为了实现这一目标&am…

AI可能造成人类灭绝,真的还是炒作?

5月30日,一封由非营利组织人工智能安全中心(Center for AI Safety)发布的简短声明轰动了AI界,导致人工智能的地位可能会被动摇。 我们在该组织的官网上找到了这份声明。声明中仅有22个单词,却饱含了专家对AI的“控诉”…

JavaEE-JVM的学习

目录 JVM执行流程JVM内存区域划分程序计时器栈堆方法区 JVM类加载机制1)Loading环节2)Linking环节2.1) Verification2.2)Preparation2.3)Resolution 3)Initializing JVM典型面试题JVM的垃圾回收机制(GC)分代回收 JVM执行流程 程序在执行之前先要把java代码转换成字节码&#xf…

盘点一个Python自动化办公需求,实现数据自动填充(下篇)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 七月七日长生殿,夜半无人私语时。 大家好,我是皮皮。 一、前言 前几天遇到了一个小需求,粉丝自己在实际工作中的需求…

回顾 | Semantic Kernel:面向 AI 编程(二) - Prompt Skill

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

子集II--(回溯+去重)

1题目 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 示例 1: 输入:nums [1,2…

基于最大似然反射率的异构激光雷达强度标定方案(开源)

文章:Maximum Likelihood Remission Calibration for Groups of Heterogeneous Laser Scanners 作者:Bastian Steder Michael Ruhnke Rainer Kummerle Wolfram Burgard 编辑:点云PCL 代码:https://github.com/soytony/IntensityCa…

vue 更新数组的方法

在 vue中,我们可以通过给数组添加索引来更新数组的值,比如我们需要在一个新的页面中添加一个新的元素,那么我们就可以通过给这个数组添加索引来实现。那么有朋友就会问了,为什么不直接在 vue中直接添加一个新的元素呢?…

chatgpt赋能python:Python列表排列顺序详解

Python列表排列顺序详解 作为一门功能丰富的高级编程语言,Python在不同类型的开发任务中广泛应用。其中,列表是一种常见的数据类型,用于存储多个元素。Python列表可以包含任何类型的数据,包括数字、字符串和其他列表等&#xff0…

干洗店软件,洗衣洗鞋线上下单小程序开发

干洗店软件洗衣洗鞋线上下单小程序; 可以实现客户自助办理,也可以和公众号、小程序等结合起来。干洗店软件可以实现客户管理,如积分管理,产品设置等功能。 线上下单,上门取货,订单拍照,订阅提示…

开发者实战 | 分割一切?Segment Anything 量化加速实战

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 分割一切? Segment Anything 量化加速实战 前言 “分割一切,大家一起失业!”——近期,这样一句话在社交媒体上大火!这讲的就是 Segment Anything Model&#xff08…

chatgpt赋能python:Python创建一个Person类

Python 创建一个 Person 类 Python 是一种高级编程语言,因为它易于学习和使用,并且可以用于多种用途。使用 Python,您可以轻松创建各种程序,从简单的脚本到完整的应用程序。Python 的一个重要特点是它的面向对象编程能力&#xf…

「VS」Visual Studio 字符集

✨博客主页:何曾参静谧的博客 📌文章专栏:「VS」Visual Studio 当我们在使用 Visual Studio 编写程序时,经常会遇到字符集的问题。在 Visual Studio 中,字符集选项有两个选项:Unicode 字符集和多字节字符集…

期刊和会议如何查询、期刊级别分类和顶会概念一文精析

期刊和会议查询、期刊级别分类和顶会概念分析 一、如何查询期刊和会议1.中文期刊-用知网出版物检索2.外文期刊-一般用letpub3.会议查询 二、国内期刊的正刊三、国内核心期刊四、国际核心期刊五、ESCI、SCI和SCIE的区别六、国际会议核心七、普刊八、顶刊九、水刊十、预警期刊 了…

一起看 I/O | Android 性能相关最新动态

作者 / Ben Weiss 过去几年来,我们一直致力于让性能提升工作变得更易上手、回报更高。我们将在本文中分享这一领域的最新发展动态。为您介绍基准配置文件、Android Studio 中的工具改进、库,以及我们如何让这项技术更好地在后台为您服务。此外&#xff0…

IPA50R190CE-ASEMI代理英飞凌MOS管IPA50R190CE

编辑:ll IPA50R190CE-ASEMI代理英飞凌MOS管IPA50R190CE 型号:IPA50R190CE 品牌:Infineon(英飞凌) 封装:TO-220F 最大漏源电流:24.8A 漏源击穿电压:500V RDS(ON)Max&#xff1…

某oa 11.10 未授权任意文件上传

漏洞简介 之前也对通达 oa 做过比较具体的分析和漏洞挖掘,前几天看到通达 oa 11.10 存在未授权任意文件上传漏洞,于是也打算对此进行复现和分析。 环境搭建 https://www.tongda2000.com/download/p2019.php 下载地址 :https://cdndown.tongda…