C/C++100个典型的Bugs(四)

2014-11-24 00:04:30 · 作者: · 浏览: 14
info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0,但由于!=优先级高于&,原代码中无括号,结果逻辑变成了file_info.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY != 0),导致is_directory将永远求值为true。
[#4] BCmenu项目 – if和else弄混
void BCMenu::InsertSpaces(void)
{
if(IsLunaMenuStyle())
if(!xp_space_accelerators) return;
else
if(!original_space_accelerators) return;
}
这又是C语言的一个“大坑”,无奈这个BCMenu项目的程序员掉坑里了。虽然从代码缩进上来看,else似乎是与最外层的if配对使用,但实际这段代码的效果是:
if(IsLunaMenuStyle())
{
if(!xp_space_accelerators) {
return;
} else {
if(!original_space_accelerators) return;
}
}
这显然不是程序员原意,看来括号必要时还是不能省略的。修改后的代码如下:
if(IsLunaMenuStyle()) {
if(!xp_space_accelerators) return;
} else {
if(!original_space_accelerators) return;
}
四、格式化输出错误
[#1] ReactOS项目 – 错误地输出WCHAR字符
static void REGPROC_unescape_string(WCHAR* str)
{
default:
fprintf(stderr,
"Warning! Unrecognized escape sequence: \\%c'\n",
str[str_idx]);
}
%c是用来格式化输出非宽字符的,这里用来输出WCHAR显然会得到错误的结果,fix solution是将%c换位%C。
[#2] Intel AMT SDK项目 – 缺少%s
void addAttribute(…)
{
int index = _snprintf(temp, 1023,
"%02x%02x:%02x%02x:%02x%02x:%02x%02x:"
"%02x%02x:02x%02x:%02x%02x:%02x%02x",
value[0],value[1],value[2],value[3],value[4],
value[5],value[6],value[7],value[8],
value[9],value[10],value[11],value[12],
value[13],value[14],value[15]);
}
不解释了,自己慢慢数和对照吧。
[#3] Intel AMT SDK项目 – 未使用的参数
bool GetUserValues(…)
{
printf("Error: illegal value. Aborting.\n", tmp);
return false;
}
显然tmp是多余的。
五、书写错误
[#1] Miranda IM项目 – 在if中赋值
void CIcqProto::handleUserOffline(BYTE *buf, WORD wLen)
{
else if (wTLVType = 0×29 && wTLVLen == sizeof(DWORD))
}
“wTLVType = 0×29”显然是笔误,应该是“wTLVType == 0×29”才对。
[#3] Clang项目 – 对象名书写错误
static Value *SimplifyICmpInst(…) {
case Instruction::Shl: {
bool NUW =
LBO->hasNoUnsignedWrap() && LBO->hasNoUnsignedWrap();
bool NSW =
LBO->hasNoSignedWrap() && RBO->hasNoSignedWrap();
}
从最后一行先后使用了LBO和RBO来看,前面只用了LBO的那行很可能是有问题的,正确的应该是:
bool NUW =
LBO->hasNoUnsignedWrap() && RBO->hasNoUnsignedWrap();
[#6] G3D Content Pak项目 – 一对括号放错了地方
bool Matrix4::operator==(const Matrix4& other) const {
if (memcmp(this, &other, sizeof(Matrix4) == 0)) {
return true;
}
}
由于括号放错了地方,导致memcmp最后的参数变成了sizeof(Matrix4) == 0,这行代码的正确写法应该是:
if (memcmp(this, &other, sizeof(Matrix4)) == 0) {
[#8] Apache Http Server项目 – 多余的sizeof
PSECURITY_ATTRIBUTES GetNullACL(void)
{
PSECURITY_ATTRIBUTES sa;
sa = (PSECURITY_ATTRIBUTES)
LocalAlloc(LPTR, sizeof(SECURITY_ATTRIBUTES));
sa->nLength = sizeof(sizeof(SECURITY_ATTRIBUTES));
}
最后一行显然是笔误,sizeof(sizeof(SECURITY_ATTRIBUTES))应该写为sizeof(SECURITY_ATTRIBUTES)才对。
[#10] Notepad++项目 – 在本来应该用&的地方使用了&&
TCHAR GetASCII(WPARAM wParam, LPARAM lParam)
{
result=ToAscii(wParam,
(lParam >> 16) && 0x