-(void)InitWithPwd:(char *)pPwd
{
char szResult[17];
//generate md5 checksum
CC_MD5(pPwd, strlen(pPwd),&szResult[0]);
szResult[16] = 0;
m_csPasswordHash[0]=0;
for(int i = 0;i < 16;i++)
{
char sz[3] = {'\0'};
//crash in blow row. The first pass is ok. The third pass crash.
//I can't understand.
sprintf(&sz[0],"%2.2x",szResult[i]);
strcat(m_csPasswordHash,sz);
}
m_csPasswordHash[32] = 0;
printf("pass:%s\n",m_csPasswordHash);
m_ucPacketType = 1;
}
我想获得密码的md5。但上面的代码一次又一次崩溃。我不明白为什么。
答案 0 :(得分:4)
您的缓冲区(sz
)太小,导致sprintf()
生成缓冲区溢出,导致未定义的行为,在您遇到崩溃的情况下。
请注意,szResult[1]
在被视为int
时可能是负值(在将char
- 类型值传递给sprintf()
时会发生这种情况),这可能会导致sprintf()
{1}}忽略字段宽度和精度指令,以格式化整个值。
Here is an example showing this problem。示例代码用C语言编写,但在这种情况下无关紧要。
这可以通过确保传入数据被视为无符号来解决问题:
sprintf(sz, "%02x", (unsigned char) szResult[i]);