gpt4 book ai didi

C-SYSMALLOC : Assertion failed (realloc)

转载 作者:行者123 更新时间:2023-11-30 17:55:49 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,用于搜索模式的所有出现并返回文件中与该模式匹配的偏移量数组。我想使用 realloc 动态增长返回的数组,但出现 SYSMALLOC 断言错误。有时,如果我使用不同的搜索模式,我可能会收到无效的下一个尺寸错误。我的机器上还没有 valgrind (需要使用调试标志重建 glibc)。这似乎是一个简单的问题,我只触摸这个指针两次——一次声明它并将其设置为 NULL,再次重新分配以增长它。我知道 sizeof(char) 是 1,在我的 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;
}
<小时/>

当使用“root”作为搜索模式在/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 上使用“daemon”作为搜索模式:

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.

有人可以看看这个并看看它看起来是否正常吗?谢谢!我是一个正在努力学习的菜鸟:)

最佳答案

解决方案是使用foundBytes 对 p 进行 decalure,然后将 realloc 行更改为:

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

我必须承认我真的不明白为什么这是必要的,看起来我这样分配的已经绰绰有余了。 (每次添加 24 个字节,而不是 3 个字符搜索模式的 3 个字节)

关于C-SYSMALLOC : Assertion failed (realloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13927593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com