如何修复C语言代码中out-of-bounds write越界写入overrun错误
越界原因说明
callLightTimerAside 越界原因
C语言数组为0基索引,长度为N的数组有效索引范围是0 ~ N-1。你定义的callLightTimerAside[FLOORSNUMBER]大小为128,有效索引只能到127,但你的循环条件写的是i <= FLOORSNUMBER,当i取值为128时就会访问到数组边界外的地址,触发越界报错,和数组大小是否匹配FLOORSNUMBER无关,是循环条件写法错误导致的。
downCallSide 越界原因
该数组大小为40,有效索引范围是0 ~ 39,循环中i最高可达128,远超出数组上限,必然触发越界。
修复方案
根据你的业务逻辑可以选择两种修复方式:
- 方案1:拆分循环分别遍历两个数组(最常用,适合需要全量初始化两个数组的场景)
修正循环条件为小于数组长度,避免索引越界:// 初始化downCallSide数组 for(i = 0; i < ILAFLOORSNUMBER; i++) { ilaByPass.downCallSide[i] = OFFSTATE; } // 初始化callLightTimer系列数组 #ifndef NA for(i = 0; i < FLOORSNUMBER; i++) { callLightTimerAside[i] = OFFSTATE; // 如需同步初始化B侧数组可以在此处加对应逻辑 } #endif - 方案2:保留单循环,加范围判断(适合楼层号和索引直接绑定,仅前40层有downCallSide属性的场景)
修正循环上限,同时对downCallSide的访问加有效范围校验:// 修正循环条件为小于,避免i=128的越界问题 for(i = 0; i < FLOORSNUMBER; i++) { // 仅当i在downCallSide有效范围内才执行赋值 if(i < ILAFLOORSNUMBER) { ilaByPass.downCallSide[i] = OFFSTATE; } #ifndef NA callLightTimerAside[i] = OFFSTATE; #endif }
内容的提问来源于stack exchange,提问作者Harshini Gnanasekar
相关产品推荐
相关产品推荐

