对抗知识焦虑,从看懂这条开始
App 下载对抗知识焦虑,从看懂这条开始
App 下载
导航平台|行为规范化建模|IMU笼式开关|阿波罗代码|航天探索|天文宇宙
1969年7月21日,迈克尔·柯林斯独自待在月球背面的指令舱里。他每两小时就要完成一次星点校准——盯着舷窗对准恒星,输入编号,让计算机把飞船姿态掰回正确轨道。这是返程的生死前提,一旦导航平台飘了,引擎点火就会指向茫茫太空。
没人知道,他当时离一场无声的灾难只差一个肘击:如果他在校准中途不小心碰到了IMU(惯性测量单元,靠陀螺仪给飞船认方向的核心设备)的笼式开关,计算机就会永远卡死在陀螺仪操作上。没有警报,没有报错,只是所有导航操作都像石沉大海。这个藏了57年的bug,直到2026年才被一种叫「行为规范化建模」的技术挖出来——而阿波罗代码早在2003年就全量公开,被全球上万开发者翻了个底朝天。
要理解这个bug,得先搞懂阿波罗制导计算机(AGC)的「资源锁」——你可以把它想象成厕所隔间的门栓:陀螺仪是唯一的隔间,每次调整姿态前必须先插上栓(获取锁LGYRO),用完再拔下来(释放锁),防止两个程序同时抢硬件。

AGC的代码里,正常校准完成后会通过STRTGYR2程序拔下门栓,但如果校准中途IMU被「笼式开关」触发(比如宇航员误碰),程序会跳转到BADEND紧急退出——这里偏偏少了拔门栓的两步指令:把零值加载到累加器,再写入锁寄存器。就像有人急着离开,忘了把厕所门栓拉开。

更致命的是,AGC有个「防御性重启」机制:一旦系统崩溃,重启会自动清空所有锁状态。过去的测试里,只要触发重启,这个bug就会被悄悄抹掉。但如果没有重启——比如柯林斯只是误碰开关又马上复位——锁就会永远卡在「占用」状态,所有后续校准都会卡在等待里,连手动调整都没用。
为什么全球上万开发者翻了19年都没发现?因为他们都在「读代码」,而发现bug的团队用了另一种思路:「看行为」。
他们用Allium——一种专门给AI读的行为规范语言——把AGC里IMU模块的13万行汇编代码,提炼成了1.25万行「资源生命周期规则」。简单说,就是给每个资源(比如LGYRO锁)写一本使用手册:什么时候必须拿,什么时候必须还,所有可能的路径都得覆盖到。
这个过程相当于让AI当「合规检查员」:先定义规则「只要拿了锁,任何路径都必须还」,再让AI顺着代码的所有分支一条条查。正常路径没问题,但当它追到BADEND分支时,规则被打破了——这里只清算了其他资源,唯独漏了LGYRO。

传统的代码审查和仿真测试,只会盯着「应该正常运行的情况」,而行为规范建模是从「资源必须被正确管理」的本质出发,逼着检查所有「没人想过会发生的异常路径」。这就像查消防隐患,不是看灭火器有没有,而是看每个房间的每个出口都能不能顺畅逃生。
这个bug不是孤例。MITRE把这种「资源拿了不还」的问题归类为CWE-772,评级为「高风险」——直到今天,它依然是软件里最常见的隐形陷阱。小到手机APP闪退,大到云计算中心宕机,很多都是因为某个文件句柄、数据库连接或者分布式锁被「遗忘」了。
阿波罗的bug能藏57年,还有个重要原因:它的代码是「焊死」在硬件里的——程序被手工编成铜线绕在磁芯上,改代码等于重新造硬件。而现在的软件迭代快,很多团队为了赶进度,把「资源释放」这种脏活累活丢给程序员手动处理,甚至依赖自动垃圾回收机制,但总有漏网之鱼。
有意思的是,当年AGC的开发者们其实已经想到了「防御性编程」,但他们没想到,这种「出问题就重启」的保护机制,反而把bug给藏得更深了。就像给漏了的水管套上保温层,暂时不漏水了,却没人发现管子已经裂了。
柯林斯最终平安返回了地球,那个可能发生的灾难永远停留在了假设里。但这个57年的bug,像一面镜子照出了软件工程里最容易被忽略的真相:我们总在盯着「怎么让程序跑起来」,却常常忘了问「程序在所有情况下都能正确停下来吗」。
行为规范化建模的价值,不止是挖出来一个老代码里的bug,它提醒我们:软件的可靠性,从来不是靠「测试正常情况」堆出来的,而是要盯着那些「没人想过会发生的异常」。
代码的盲区,才是最致命的风险。