C boolean 无效值处理

标签 c boolean safety-critical

<分区>

我在一个安全关键的嵌入式 C 项目中,有一个关于检测 boolean 变量中的内存损坏(例如缓冲区溢出)的讨论。众所周知,在 C 中,“boolean”类型实际上是一个 N 位整数,这意味着它可能有 2N-2 个无效值。 例如。如果您将 FALSE 声明为 0 并将 TRUE 声明为 1(通过宏、常量或枚举),则可以说 <0(在签名类型的情况下)或 >1 是内存损坏(或错误)的结果。

所以理论上应该可以构建这样的故障捕获代码块:

if (b == TRUE)       { /* Good, do something               */ }
else if (b == FALSE) { /* Good, but don't do anything      */ }
else                 { /* Memory corruption. Deal with it. */ }

或者用 switch-case 来做。状态变量和其他枚举类型是强制性的,但 boolean 值肯定会增加很多代码,我的问题是 - 这值得付出努力吗?

最佳答案

取决于您尝试达到的安全等级。考虑到内存损坏也可能意味着 bit0 的更改会使 TRUE 变为 FALSE,反之亦然,上述示例并不是很安全。

因此,我看到了更多用于保护关键变量的包装。

例如将每个变量存储在一个由变量本身及其补码组成的结构中作为副本。

struct tag_intvar{
    int variable;
    int complement;
};

然后使用 getter/setter 函数授予原子访问权限并执行一致性检查/处理。

int setintvalue(tag_intvar* var, int val){
    if(isconsistent(var)){
        var.variable = val;
        var.complement = ~val;
        return TRUE;
    }
    //... inconsistent... handler
    return FALSE;
}

同时

int isconsistent(tag_intvar* var){
   return (var.variable == ~var.complement)?TRUE:FALSE;
}

关于C boolean 无效值处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61871401/

相关文章:

c 插孔音频连接套件 : how to properly play a song if my sound card sample rate differs from the song's?

java - Java 和 C 之间的代码点不匹配

无论操作数和运算符如何,PHP MySQL 比较始终为真

c - 我的 linux 的 gcc 编译器不支持 boolean 值

C++ 运算符重载错误检查无异常

c - 在 C 中的编译时查找 100 个结构的最大大小

node.js - Node Express Jade - 复选框 boolean 值

c++ - cppcheck 的规则集

Linux CAN总线传输超时

c - 数组/指针 : Left operand must be l-value