2012-12-18 39 views
0

我正在尝试编写一个函数,用于搜索所有出现的模式,并返回与该模式匹配的文件中的偏移量数组。我想使用realloc动态增长我返回的数组,但我得到sYSMALLOC断言错误。有时候,如果我使用不同的搜索模式,我可能会收到无效的下一个大小错误。我的机器上没有valgrind(需要用调试标志重建glibc)。这似乎是一个这样简单的问题,我只触摸这个指针两次 - 一次声明它并将其设置为NULL,并再次重新分配以增加它。我知道sizeof(char)是1,在我的realloc语句中没有用处。C - sYSMALLOc:声明失败(realloc)

这里是有问题的函数的代码。使用 “根” 作为搜索图案

unsigned long long* searchBytes(FILE* fp, char* byteString, char* searchType, unsigned long long fileSize) 
{ 
if (fp == NULL) 
    return NULL; 

unsigned long long* foundBytes = NULL; 
long numBytes = 0; 

// make some memory for the array of found bytes 
if (strcmp(searchType, "ascii") == 0) 
{ 
    numBytes = strlen(byteString); 
    //foundBytes = realloc(NULL, numBytes * sizeof(char)); 
} 
else 
{ 
    // TODO strip the spaces from the string and handle hex searches 
    printf("hex-search not implemented yet.\n"); 
    return NULL; 
} 

// loop over all the bytes in the file looking for this ascii pattern 
unsigned long long currentOffset = 0; 
unsigned long long origOffset = 0; 
unsigned long long m = 0; 
foundWords = 0; 
char* possibleWord = malloc(numBytes * sizeof(char)); 

do 
{ 
    fseek(fp, currentOffset, SEEK_SET); 
    unsigned long long i; 
    int n = 0; 
    int failed = 0; 
    origOffset = currentOffset; 

    for(i=currentOffset; i<currentOffset+numBytes; i++) 
    { 
     possibleWord[n] = fgetc(fp); 
     n++; 
    } 
    //printf("possibleWord: %s\n", possibleWord); 

    // is this our word? use strstr just in case 
    char* found = strstr((const char*) byteString, (const char*) possibleWord); 
    if (found) 
    { 
     foundWords++; 
     // make a bigger spot for it 
     printf("allocating %ld bytes to add word %d to list...\n", (numBytes*foundWords) * sizeof(char), foundWords); 
     unsigned long long* p = realloc(foundBytes, (numBytes*foundWords) * sizeof(char)); 
     if (p) 
     { 
      foundBytes = p; 

      for (i = origOffset; i<origOffset+numBytes; i++) 
      { 
       foundBytes[m] = i; 
       //printf("added offset %llu to foundBytes[%llu]\n", i, m); 
       m++; 
      } 

     } 
     else 
     { 
      return NULL; 
     } 

    } 
    else 
    { 
     failed = 1; 
    } 

    if (failed == 0) 
    { 
     currentOffset += numBytes; 
     //printf("Yay! moving forward %ld bytes.\n", numBytes); 
    } 
    else 
    { 
     currentOffset++; 
    } 
} 
while (currentOffset < fileSize); 

if (foundWords > 0) 
{ 
    //printf("returning foundBytes!\n"); 

    //unsigned long long z; 
    //for (z=0; z<foundWords*numBytes; z++) 
    // printf("%llu\n", foundBytes[z]); 
    //printf("...\n"); 
    return foundBytes; 
} 
//printf("returning NULL\n"); 
return NULL; 
} 

时上运行/ etc/passwd中:

allocating 4 bytes to add word 1 to list... 
allocating 8 bytes to add word 2 to list... 
*** glibc detected *** ./chex3: realloc(): invalid next size: 0x0000000001a59270 *** 

或上/ etc/passwd中使用 “守护程序” 作为搜索模式:

allocating 6 bytes to add word 1 to list... 
allocating 12 bytes to add word 2 to list... 
chex3: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 

有人可以看看这个,看看它看起来好吗?谢谢!我是一个小白努力学习:)

+0

'strlen()'不计算每个字符串末尾的尾部NUL(''\ 0'')字符。另外,不要用'sizeof(char)'乘以alloc计数,它总是为'1'。 –

回答

0

的解决方案是decalure p往上顶与foundBytes,然后更改realloc的行:

p = realloc(foundBytes, (numBytes*foundWords) * sizeof(*p)); 

我必须承认,我真的不明白这是为什么必要的,似乎我分配了足够多的这种方式。 (每次添加24个字节,而不是3个字符的搜索模式)