防止滥用逻辑运算符而不是按位运算符

时间:2009-06-11 10:43:34

标签: c++ bit-manipulation operators

在C ++中,可以使用双向运算符的逻辑运算符:

int unmasked = getUnmasked(); //some wide value
int masked = unmasked & 0xFF; // izolate lowest 8 bits

第二个陈述可能很容易被错误输入:

int masked = unmasked && 0xFF; //&& used instead of &

这将导致错误的行为 - masked现在将为0或1,当它打算从0到255时.C ++不会抱怨。

是否可以设计代码,以便在编译器级别检测到此类错误?

4 个答案:

答案 0 :(得分:4)

在编码标准中禁止在代码的任意部分直接使用任何按位运算。强制要求调用函数

所以而不是:

int masked = unmasked & 0xFF; // izolate lowest 8 bits

你写道:

int masked = GetLowestByte(unmasked);

作为奖励,你将得到一个代码库,它没有几十个容易出错的按位操作遍布它。

只有在一个地方(GetLowestByte及其姐妹的实现),你才会有实际的按位操作。然后你可以阅读这些线两三次,看看你是否吹了它。更好的是,您可以对该部分进行单元测试。

答案 1 :(得分:3)

这有点Captain Obvious,但您当然可以应用encapsulation并隐藏类中的位掩码。然后,您可以使用运算符重载来确保您认为合适的布尔值operator&&()

我想这样一个“安全面具”的体面实现也不一定非常昂贵。

答案 2 :(得分:3)

在某些情况下,您可能会收到编译器警告(我不希望您的示例中有一个警告)。像lint这样的工具可能能够发现可能的错误。

我认为唯一可以确定的方法是定义编码标准,使两个运算符之间的区别更明显 - 例如:

template<typename T>
T BitwiseAnd( T value, T mask ) { return value & mask; }

禁止按位运算符&amp;和|

答案 3 :(得分:2)

两个运算符都表示对整数的有效运算,因此我没有看到任何检测问题的方法。编译器应该如何知道您真正想要的操作?