在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 ++不会抱怨。
是否可以设计代码,以便在编译器级别检测到此类错误?
答案 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)
两个运算符都表示对整数的有效运算,因此我没有看到任何检测问题的方法。编译器应该如何知道您真正想要的操作?