【发布时间】:2011-02-15 13:14:14
【问题描述】:
我有一个堆分配错误,我无法在我的代码中发现该错误,该错误在 Linux 上的 vanguard/gdb 上被拾取,但在 Windows cygwin 环境中完美运行。我知道 Linux 的堆分配可能比 Windows 更严格,但我真的很想得到一个发现问题/可能修复的回应。我也知道我不应该在 C 中对 malloc 进行类型转换,但这是一种习惯的力量,不会改变我的问题的发生。我的程序实际上在 Linux 和 Windows 上都没有错误地编译,但是当我在 Linux 中运行它时,我得到了一个看起来很吓人的结果:
malloc.c:3074: sSYSMALLOc: 断言 `(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)' 失败。 中止
我的代码中的附加 sn-p 被指出为错误以供审查:
/* Main */
int main(int argc, char * argv[]) {
FILE *pFile;
unsigned char *buffer;
long int lSize;
pFile = fopen ( argv[1] , "r" );
if (pFile==NULL) {fputs ("File error on arg[1]",stderr); return 1;}
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
buffer = (char*) malloc(sizeof(char) * lSize+1);
if (buffer == NULL) {fputs ("Memory error",stderr); return 2;}
bitpair * ppairs = (bitpair *) malloc(sizeof(bitpair) * (lSize+1));
//line 51 below
calcpair(ppairs, (lSize+1));
/* irrelevant stuff */
fclose(pFile);
free(buffer);
free(ppairs);
}
typedef struct {
long unsigned int a; //not actual variable names... Yes I need them to be long unsigned
long unsigned int b;
long unsigned int c;
long unsigned int d;
long unsigned int e;
} bitpair;
void calcpair(bitpair * ppairs, long int bits);
void calcPairs(bitpair * ppairs, long int bits) {
long int i, top, bot, var_1, var_2;
int count = 0;
for(i = 0; i < bits; i++) {
top = 0;
ppairs[top].e = 1;
do {
bot = count;
count++;
} while(ppairs[bot].e != 0);
ppairs[bot].e = 1;
var_1 = bot;
var_2 = top;
bitpair * bp = &ppairs[var_2];
bp->a = var_2;
bp->b = var_1;
bp->c = i;
bp = &ppairs[var_1];
bp->a = var_2;
bp->b = var_1;
bp->c = i;
}
return;
}
gdb 报告:free():无效指针:0x0000000000603290 *
由于“VALGRIND INTERNAL ERROR”信号 11 (SIGSEGV),valgrind 在退出前 5 次报告以下消息:
大小为 8 的无效读取
==2727== 在 0x401043: calcPairs (在 /home/user/Documents/5-3/ubuntu test/main)
==2727== by 0x400C9A: main (main.c:51)
==2727== 地址 0x5a607a0 没有被堆栈、malloc 或(最近)释放
【问题讨论】:
-
我认为你遗漏了有趣的部分.. calcpair() 中发生了什么?
-
感谢 cmets,我已更新 OP 以包含 calcpair() 的 sn-p。 'buffer' 用于对第二个文件执行迭代 fread,一次 1 个字节:fread (buffer,1,1,pFile);
-
对不起,迭代 fread 在 OP (pFile) 中打开的同一个文件上。
-
这是你完整的
calcPairs函数还是只是一个sn-p?如果这就是全部,那么您有几个问题,其中最重要的是do {...} while循环运行超过数组末尾的能力。 -
如果您需要诊断帮助,请将您的全部资源放在网站上并链接到它。如果您没有自己的网站,pastebin.com 是一个好地方(但不是存档)。