为何逻辑相同的两段代码,含for循环的版本会触发C4715编译警告?
C4715警告触发原因解释
C4715是微软MSVC编译器特有的警告,触发规则为:声明了非void返回值的函数,存在至少一条控制路径执行到函数结束时都没有返回值。
两段代码的控制流分析
无for循环的代码
int func(int n){ if(n == 0){ return 0; } else { return -1; } }
这段代码的if-else分支覆盖了所有可能的输入情况,两个分支都明确写了返回语句,不存在走到函数末尾的路径,编译器可以直接识别到所有控制路径都有返回值,因此不会触发警告。
带for循环的代码
int func(int n){ for(int i=0; i<1; i++){ if(n == 0){ return 0; } else { return -1; } } }
虽然从运行逻辑来看,i<1的循环条件注定会执行1次循环体,所有路径都会在循环内返回,但是MSVC的静态控制流分析不会对循环条件的常量值做深度推导,它只会按照通用的循环结构判定:存在循环一次都不执行的可能性。如果循环不执行,程序就会走到for循环外部、函数结束的位置,这里没有对应的返回语句,因此编译器会触发C4715警告。
如果要消除该警告,只需要在for循环的末尾补充一个兜底的返回语句即可,或者直接删除无实际作用的外层for循环。
内容的提问来源于stack exchange,提问作者kims
相关产品推荐
相关产品推荐

