+j) 在 GCC -O2优化下输出错误的事件时间线)
事件时间线1、问题引入 (r12-6382)◆时间2022-01-08 08:54:29UTC0事件开发者Jakub Jelinek提交代码变更r12-6382引入了一个新的match.pd优化规则。该规则旨在简化指针运算表达式但意外地与后续优化环节产生不良互动为日后的Bug埋下伏笔。并且该变更合并到当时的GCC主分支trunk使得从GCC 12.1开始的所有版本都受到影响。相关链接GCC 12 提交记录[r12-6382]◆时间2022-03-23 14:08:07UTC0事件开发者Jakub Jelinek将r12-6382的部分优化规则回溯移植到GCC 11分支提交号为r11-9688这使得同样的match.pd优化规则被引入到该分支从而导致GCC 11.3、11.4、11.5等后续版本也受到相同问题的影响。这解释了为何在使用GCC 11.4.0时也会复现与r12-6382相关的错误。相关链接GCC 11 提交记录 [r11-9688]2、贴吧用户发现Bug◆时间 2026-02-27 18:03事件贴吧用户ZY201107在“C语言吧”发布帖子《关于指针的一些问题》描述了在Release模式-O2下程序输出错误而Debug模式-O0正常的问题。相关链接关于指针的一些问题◆时间2026-03-02 21:31事件用户AN-drew在帖子第15楼通过对比不同优化级别首次明确指出问题根源在于Release模式默认开启的-O2优化。相关链接关于指针的一些问题 #153、Bug报告与修复 (PR124358)◆时间 2026-03-04 13:08:42UTC0事件开发者Andrew Pinski在PR124358中分析了问题的本质指出GCC中间表示GIMPLE生成了错误的(*_6)[0]访问而正确的应该是__MEM int(_6)。相关链接PR124358 报告页面◆时间 2026-03-06 07:21:41UTC0事件开发者Jakub Jelinek提交了针对PR124358的修复补丁。修复方案是将类型转换NOP_EXPR移到POINTER_PLUS_EXPR内部避免被STRIP_NOPS跳过而触发错误的ARRAY_REF生成。相关链接PR124358 Bugzilla 主页面PR124358 修复补丁提交◆时间2026-03-10 11:14:46UTC0事件用户xiongzile99在PR124429中详细报告了该问题。报告指出该问题在GCC 11.3及更高版本中存在使用-O1正常而-O2错误且可通过-fno-strict-aliasing规避。该报告随后被标记为PR124358的重复报告Duplicate。相关链接PR124429 报告页面4、回溯移植 (Backports)◆时间2026-03-06 07:20:11UTC0事件修复补丁被合并到GCC主分支trunk提交号为r16-7923。该修复将包含于GCC 16.1及后续版本。相关链接GCC 16 提交记录[r16-7923]◆时间2026-03-08 05:23:20UTC0事件修复被回溯移植到GCC 15分支提交号为r15-10917。该修复将包含于GCC 15.3及后续版本。相关链接GCC 15 提交记录[r15-10917]◆时间2026-03-11 06:10:50UTC0事件修复被回溯移植到GCC 14分支提交号为r14-12419。该修复将包含于GCC 14.4及后续版本。相关链接GCC 14 提交记录[r14-12419]◆时间2026-03-22 05:21:27UTC0事件修复被回溯移植到GCC 13分支提交号为r13-10212。因新版本尚未发布该修复将可能包含于GCC 13.5及后续版本。相关链接GCC 13 提交记录[r13-10212]总结项目内容根本原因r12-6382引入的match.pd优化规则与gimple_fold_indirect_ref函数交互错误地将“读取数组中特定元素”解释为“读取数组每一行的首个元素”误导后续优化删除了其他元素的初始化代码。修复方案调整match.pd中优化规则的执行顺序将类型转换置于指针加法内部。修复版本GCC 13.5*r13-10212尚未发布、GCC 14.4r14-12419、GCC 15.3r15-10917、GCC 16.1r16-7923及后续版本。