1
-(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。但是上面的代码一次又一次地崩溃。我不明白为什么。

4

1 回答 1

4

您的缓冲区 ( sz) 太小,导致sprintf()生成缓冲区溢出,从而导致未定义的行为,在您的情况下是崩溃。

请注意,szResult[1]当被视为一个负值时(在将-type 值int传递给 时会发生这种情况),这可能会导致忽略您的字段宽度和精度指令以格式化完整值。charsprintf()sprintf()

这是一个显示此问题的示例。示例代码是用 C 编写的,但这对于这种情况无关紧要。

这通过确保传入的数据被认为是无符号的来解决问题:

sprintf(sz, "%02x", (unsigned char) szResult[i]);
于 2013-02-06T10:46:03.673 回答