1

我在一个安全关键的嵌入式 C 项目中,并且有一个关于检测布尔变量中的内存损坏(例如缓冲区溢出)的讨论。众所周知,在 C 语言中,“布尔”类型实际上是一个 N 位整数,这意味着它可能有 2 N -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. */ }

或者用开关盒来做。状态变量和其他枚举类型是强制性的,但是为布尔值做这件事肯定会增加很多代码,我的问题是——值得付出努力吗?

4

1 回答 1

0

取决于您尝试达到的安全等级。考虑到内存损坏也可能意味着 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;
}
于 2020-05-18T14:34:27.750 回答