objective-c我无法理解为什么使用sprintf lead程序崩溃

时间:2013-02-06 10:41:54

标签: objective-c c xcode4.5

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

1 个答案:

答案 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]);