gpt4 book ai didi

c - MISRA C 2012 规则 16.1 所有 switch 语句都应格式正确

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:30 27 4
gpt4 key购买 nike

我正在尝试从我的代码中消除违反 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 年代的事情,现在只是过早的优化。

关于c - MISRA C 2012 规则 16.1 所有 switch 语句都应格式正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49001701/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com