当前位置:网站首页>C专家编程 第10章 再论指针 10.8 轻松一下---程序检验的限制
C专家编程 第10章 再论指针 10.8 轻松一下---程序检验的限制
2022-08-10 16:03:00 【weixin_客子光阴】
工程师所存在的问题是他们采取欺骗手段以获取结果
数学家所存在的问题是他们研究一些玩具性的问题以获得结果
程序检验员所存在的问题是他们在玩具性的问题上采取欺骗手段以获得结果。---匿名人士
不使用临时变量交换两个值
有人问我下面的程序段(用于交换两个值)能否达到目的:
*a ^= *b; /*执行3个连续的异或操作*/
*b ^= *a;
*a ^= ^b;
在满足下面两种标准的前提下执行下面这个序列:这几个操作都是原子操作;它在执行时不会发生硬件失败、内存空间不够或数学运算失败等问题。
*a ^= *b; *b ^= *a; *a ^= ^b;
之后,*a和*b的值将是f3(a)和f3(b)。其中,
f3 = lambda x.(x == a ? f2(a) ^ f2(b) : f2(x));
f2 = lambda x.(x == b ? f1(b) ^ f1(a) : f1(x));
f1 = lambda x.(x == a ? *a ^ *b : *x);
这样一来,这段代码只会产生两种结果(源于beta reduction),即
如果a和b相同:f3(a) = f3(b) = 0
如果a和b不相同:f3(a) = b, f3(b) = a;
数学检验和验证是唯一可靠的技巧。否则的话,程序就是工程黑客的作品罢了。与人们想象的相反,所有的C程序都容易根据这种方法通过数学分析来进行驾驭。
也就是:
如果a和b相同:f3(a) = f3(b) = 0
如果a和b不相同:f3(a) = b, f3(b) = a;
实际上应该是:
f3(a) = *b,且f3(b) = *a...
不仅这个检验存在两个错误,而且它所“检验”的C程序事实上也不正确!大家都知道在C语言中不可能不使用临时变量来交换两个值(在一般情况下)。在此例中,如果a和b指向重叠的对象,这个算法就会失败。另外,如果其中一个变量存储于寄存器中或者是一个位段,这个算法也不可行,因为无法取得寄存器地址或者位段的地址。如果*a和*b是长度不同的类型,或者它们其中之一指向一个数组,该算法同样不行。
程序检验的问题,可以阅读一篇文章Social Precessed and Proofs of Theorems and Programs,刊登于Communications of the ACM。
边栏推荐
猜你喜欢

易基因|深度综述:m6A RNA甲基化在大脑发育和疾病中的表观转录调控作用

web安全入门-Kill Chain测试流程

Recommend a few had better use the MySQL open source client, collection!

多线程面试指南

xlink解读

MySQL-创建、修改和删除表

FP6378AS5CTR SOT - 23-5 effective 1 mhz2a synchronous buck regulator

Gif动图怎么用视频做?一键在线完成视频转gif制作

Kubernetes kube-proxy工作原理

An ABAP tool that can print the browsing history of a user in the system for BSP applications
随机推荐
关于Web渗透测试需要知道的一切:完整指南
商业智能BI行业分析思维框架:铅酸蓄电池行业(二)
易基因|深度综述:m6A RNA甲基化在大脑发育和疾病中的表观转录调控作用
I met a 25k+ from Tencent, he let me see what kind of basic ceiling
功能测试vs.非功能测试:能否非此即彼地进行选择?
mysql按月查询统计(统计近12个月的项目个数)
Reids 源码导读
秘密共享方案介绍SS
Detailed understanding of all built-in functions (Part 2)
Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
异形屏为led显示行业带来更多希望
Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
常用持续集成工具对比
第叁章模块大全之《 os模块》
Colocate Join :ClickHouse的一种高性能分布式join查询模型
LeetCode-692. Top K Frequent Words
不爱生活的段子手不是好设计师|ONES 人物
商业版SSL证书
Parse the value of uuid using ABAP regular expressions
虚拟电厂可视化大屏,深挖痛点精准减碳