我正在尝试从我的代码中消除违反 og 规则 16.1 的情况。
示例代码:
switch (cmd) {
case ADD:
result = add(op1, op2);
break;
case SUB:
if (!flag) { // Problem here!
break;
}
//Fallthrough
case ALU_CMD_SUB:
result = sub(op1, op2);
.
.
.
.
.
.
break;
case ALU_CMD_DIV:
result = divide(op1, op2);
break;
case ALU_CMD_EXP:
result = (int32_t)expo((uint32_t)op1, (uint32_t)op2);
break;
default:
incr_default(&default_cond);
//fix for the violation: insert a break statement
break;
}
这里带有 SUB 的 switch case 格式不正确。
有没有办法在代码中没有太多噪音的情况下解决这个问题。
这也违反了 switch case 没有 break 语句的规则 16.3。
修复起来相当简单:
case SUB:
SUB_stuff();
ALU_CMD_SUB_stuff();
break;
case ALU_CMD_SUB:
ALU_CMD_SUB_stuff();
break;
让编译器操心如何将上面的代码翻译成分支数量最少的机器码。
这些是非常合理的 MISRA 规则,因为“案例失败”的存在是非常危险的,而且几乎总是由于意外忘记 break
或底层设计不佳造成的。我曾经是“case fall-through”的粉丝,但最终意识到使用这种 fall-throughs 的需要源于程序其他地方的困惑思维。
同样,将它用于代码优化目的(例如“Duff 的设备”)是 1980 年代的事情,现在只是过早的优化。
我是一名优秀的程序员,十分优秀!