在Fedora 17 64位上使用C GCC的可变数据损坏



我正在创建一个临时缓冲区,并使用sprintf将字符串复制到缓冲区。然后调用函数analyzeRecordForPGDBOperation,将缓冲区作为参数传递。我用strtok解析字符串,并使用|作为分隔符。我看到一个奇怪的问题,codesite的值后来被损坏,即使它在开关情况2中正确打印。当我打印大小写3和大小写4时,codesite的值不正确。

我试图在gdb中使用监视代码站点变量来查看它的原因,我得到以下输出,但我不确定为什么我得到这个问题。

[root@pe1800xs64 trunk]# uname -r3.9.10-100.fc17.x86_64

" GDB输出:"

旧值= "71663138"," 00 "新值= " 000 061 066 066 063 061 063 070","000年"

0x00000038f30939ee in __strcpy_sse2_unaligned () from/lib64/lib .so.6

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main() 
{
    char tmp[256];
    sprintf(tmp, "%s", "99|71663138|316DEA40C62D6BA40B3C0AA2FE06C457|1442319758");
    analyzeRecordForPGDBOperation(tmp);
    return 0;
}
void analyzeRecordForPGDBOperation(char *data)
{
    char tempBuff[256] = {'',};
    char park[16] = {'',};
    char codesite[16] = {'',};
    char key[24] = {'',};
    char timestamp[16] = {'',};
    int caseVal = 0;
    sprintf(tempBuff, "%s", data);
    char *p = strtok(tempBuff,"|");
    for (; p != NULL; p = strtok(NULL, "|"))
    {
        caseVal++;
        switch(caseVal)
        {
            case 1:
                sprintf(park, "%s", p);
                break;
            case 2:
                sprintf(codesite, "%s", p);
                //Value of codesite is printed correctly here
                printf("nCodesite: %sn", codesite);
                break;
            case 3:
                sprintf(key, "%s", p);
                //Value of codesite is corrupted
                printf("nCodesite Case 3: %sn", codesite);
                break;
            case 4:
                sprintf(timestamp, "%s", p);
                //Value of codesite is corrupted
                printf("nCodesite case 4: %sn", codesite);
                break;
            default:
                break;
       }
    }
}
输出:

[root@pe1800xs64 trunk]# ./a.out

analyzeRecordForPGDBOperation

Codesite: 71663138案例3:

例子4:

如果这个"316DEA40C62D6BA40B3C0AA2FE06C457"是您需要复制到case 3上的值,那么目标缓冲区key不够大。

这会触发未定义的行为,这就是为什么您在codesite中看到奇怪的结果,即使您没有直接修改它。

我分配的缓冲区大小较小。缓冲区大小是24,而我试图复制33个字符到它。因此,内存被损坏了。有了新的尺寸,问题就解决了。

char codesite[16] = {'',};Char key[35] = {'',};

Thanks for the help

相关内容

  • 没有找到相关文章

最新更新