2015-09-16 6 views
0

Я создаю временный буфер и копирую строку в буфер с помощью sprintf. Затем я вызываю функцию analysisRecordForPGDBOperation, передавая буфер в качестве параметра. I Разбор строки с помощью strtok с использованием | как разделитель. Я вижу странную проблему, когда значение кодового кода повреждено позже, хотя оно правильно напечатано в корпусе переключателя 2. Значение кода не соответствует, когда я печатаю в случае 3 и в случае 4.Переменная повреждение данных с C GCC на Fedora 17 64 бит

Я попытался увидеть резонанс для он в gdb, используя часы на переменной codeite, я получаю следующий вывод, но я не уверен, почему я получаю эту проблему.

[корень @ pe1800xs64 ствол] # uname -r 3.9.10-100.fc17.x86_64

"Выход из GDB:"

Прежнее значение = "71663138" , '\ 000' Новое значение = "\ 000 \ 061 \ 066 \ 066 \ 063 \ 061 \ 063 \ 070", '\ 000'

0x00000038f30939ee в __strcpy_sse2_unaligned() из /lib64/libc.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] = {'\0',}; 
    char park[16] = {'\0',}; 
    char codesite[16] = {'\0',}; 
    char key[24] = {'\0',}; 
    char timestamp[16] = {'\0',}; 
    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: %s\n", codesite); 
       break; 
      case 3: 
       sprintf(key, "%s", p); 
       //Value of codesite is corrupted 
       printf("\nCodesite Case 3: %s\n", codesite); 
       break; 
      case 4: 
       sprintf(timestamp, "%s", p); 
       //Value of codesite is corrupted 
       printf("\nCodesite case 4: %s\n", codesite); 
       break; 
      default: 
       break; 
     } 
    } 
} 

Выход:

[корень ствол @ pe1800xs64] # ./a.out

analyzeRecordForPGDBOperation

сайте Google Code: 71663138

CodeSite Случай 3:

CodeSite случай 4:

+0

Вы читаете 32-буквенный ключ в 24-байтовый буфер. Уч. –

+1

попробуйте увеличить длину буферов назначения. –

+0

Никогда не используйте 'sprintf', но всегда используйте [snprintf] (http://man7.org/linux/man-pages/man3/snprintf.3.html), например. 'snprintf (временная метка, sizeof (временная метка),"% s ", p);'; рассмотрите также [asprintf] (http://man7.org/linux/man-pages/man3/asprintf.3.html) –

ответ

3

"316DEA40C62D6BA40B3C0AA2FE06C457" Если это значение, которое вам нужно скопировать на case 3, то буфер назначения key не является достаточно большим.

Это вызывает неопределенное поведение, и именно поэтому вы видите странный результат в codesite, даже если вы не изменили его напрямую.

0

Размер буфера, который я выделил, был меньше. Размер буфера равен 24, в то время как я пытаюсь скопировать на него 33 символа. Следовательно, память повреждена. С новым размером проблема решена.

char codeite [16] = {'\ 0',}; char key [35] = {'\ 0',};

Спасибо за помощь

+3

Вы должны были принять какой-то ответ, а не добавлять свои Комментарии... –

 Смежные вопросы

  • Нет связанных вопросов^_^