*** glibc detected *** ./a.out malloc() memory corruption


 
Thread Tools Search this Thread
Top Forums Programming *** glibc detected *** ./a.out malloc() memory corruption
# 1  
Old 06-23-2013
Sun *** glibc detected *** ./a.out malloc() memory corruption

I am facing a problem of memory corruption. The loop runs for the first time but does not go through the second time. What could be the problem?


Code:
for(int z=0;z<2;z++)
{
fp=fopen("poly.dat","r");

/*do something which reads this file into a 2D array*/

fclose(fp);

fp=fopen("poly.dat","w");
/*do something which writes into this file*/

fclose(fp);

printf("\n***********************\n");
}


*** glibc detected *** ./a.out: malloc(): memory corruption: 0x09f901b0 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6[0xb7747376] 
/lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x95)[0xb7748ac5] 
/lib/tls/i686/cmov/libc.so.6[0xb7734acf] 
/lib/tls/i686/cmov/libc.so.6(fopen+0x2c)[0xb7734b9c] 
./a.out[0x8048807] 
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb76eb775] 
./a.out[0x8048621] 
======= Memory map: ======== 
08048000-0804a000 r-xp 00000000 08:05 6619566    /home/dare/Desktop/a.out 
0804a000-0804b000 r--p 00001000 08:05 6619566    /home/dare/Desktop/a.out 
0804b000-0804c000 rw-p 00002000 08:05 6619566    /home/dare/Desktop/a.out 
09f90000-09fb1000 rw-p 09f90000 00:00 0          [heap] 
b7500000-b7521000 rw-p b7500000 00:00 0  
b7521000-b7600000 ---p b7521000 00:00 0  
b76b6000-b76c3000 r-xp 00000000 08:05 7225409    /lib/libgcc_s.so.1 
b76c3000-b76c4000 r--p 0000c000 08:05 7225409    /lib/libgcc_s.so.1 
b76c4000-b76c5000 rw-p 0000d000 08:05 7225409    /lib/libgcc_s.so.1 
b76d4000-b76d5000 rw-p b76d4000 00:00 0  
b76d5000-b7831000 r-xp 00000000 08:05 7242659    /lib/tls/i686/cmov/libc-2.9.so 
b7831000-b7832000 ---p 0015c000 08:05 7242659    /lib/tls/i686/cmov/libc-2.9.so 
b7832000-b7834000 r--p 0015c000 08:05 7242659    /lib/tls/i686/cmov/libc-2.9.so 
b7834000-b7835000 rw-p 0015e000 08:05 7242659    /lib/tls/i686/cmov/libc-2.9.so 
b7835000-b7838000 rw-p b7835000 00:00 0  
b7842000-b7849000 rw-p b7842000 00:00 0  
b7849000-b784a000 r-xp b7849000 00:00 0          [vdso] 
b784a000-b7866000 r-xp 00000000 08:05 7225754    /lib/ld-2.9.so 
b7866000-b7867000 r--p 0001b000 08:05 7225754    /lib/ld-2.9.so 
b7867000-b7868000 rw-p 0001c000 08:05 7225754    /lib/ld-2.9.so 
bfb3e000-bfb53000 rw-p bffea000 00:00 0          [stack] 
Aborted

Moderator's Comments:
Mod Comment Please use CODE tags when posting code and sample output.

Last edited by Don Cragun; 06-23-2013 at 02:22 PM..
# 2  
Old 06-23-2013
The only thing that can be said for certain is that the corruption is occurring in the heap. If you would like useful feedback, post your code instead of hiding it behind comments. And, please, use code tags in your post to preserve the indentation.

Regards and welcome to the forum,
Alister
# 3  
Old 06-23-2013
Code:
#include<stdio.h>
	#include<stdlib.h>
	#include<time.h>

	int random_no(int);
	void calc_file_row_col(FILE *,int *,int *);

	int main()
	{
	int i,j,z;
	int temp=0;
	int row,column;

	FILE *fp;
	char x,**a;

	for(z=0;z<2;++z){
	fp=fopen("poly.dat","r");
	
	calc_file_row_col(fp,&row,&column);     //Function which calculates 
                                                      // the no of rows and column of a file
	
        a=calloc(row,sizeof(char *));			// Declare a 2D array of size 
                                                                // row by column   
	for(i=0;i<row;i++)
		a[i]=calloc(column,sizeof(char));

	for(i=0;i<row;i++)				//  Read the elements of file fp into 
		{                                      //  array a
		for(j=0;j<column+1;j++)
			{
			x=getc(fp);
			if(x=='\n')
			{}
			else
			{
			*(*(a+i)+j)=x;
			}
		}}

	fclose(fp);
	fseek(fp,0,SEEK_SET);

	temp=random_no(row);			// Generates a random no. between 0 and row
	printf("temp=%d\n",temp);

	fp=fopen("poly.dat","w");

	for(i=0;i<temp;i++)		//Write elements from 0 to temp and then temp to row in file fp; 
		{
		for(j=0;j<column;j++)
			fprintf(fp,"%c",a[i][j]);

	fprintf(fp,"\n");
	}

	for(i=temp+1;i<row;i++)
		{
		for(j=0;j<column;j++)
			fprintf(fp,"%c",a[i][j]);

		fprintf(fp,"\n");
		}	

	fclose(fp);	

	for(i=0;i<row;i++)
	free(a[i]);

	free(a);
	a=NULL;
	}

	return 0;
	}

	int random_no(int range)
	{
	int LOW=0;							
	int r;						
	time_t seconds;                                 
	time(&seconds);                                 
	srand((unsigned int)seconds);                                       
	r = rand() % (range - LOW + 1) + LOW;                       
	return r%range;
	}

	void calc_file_row_col(FILE *poly,int *row,int *column)
	{
	int m=0;
	int n=0;
	char x;
	fseek(poly,0,SEEK_SET);
	while((x=getc(poly))!=EOF)
	{
	if(x=='\n'){
		m++;
		n=0;
		}
	else{
		n++;
		*column=n;
		}
	}
	*row=m;
	printf("row=%d column=%d\n",*row,*column);
	fseek(poly,0,SEEK_SET);
	}



The file poly.dat is:

Code:
	00132404 
	00013240 
	00001324 
	a0000132 
	16000013 
	53200001 
	05460000 
	4061a000 
	24062a00 
	32406fe0 
	132407aa 
	0132407d 
	13240860 
	00013240 
	00001324 
	e0000132

Moderator's Comments:
Mod Comment Please use CODE tags; not ICODE tags for multi-line blocks.

Last edited by Don Cragun; 06-23-2013 at 05:46 PM.. Reason: Fix tags
# 4  
Old 06-23-2013
You are corrupting the heap by calling fseek on a stream that's been closed.

Regards,
Alister
# 5  
Old 06-24-2013
Checking the return value of calloc would be a good place to start...
# 6  
Old 06-24-2013
Quote:
Originally Posted by shamrock
Checking the return value of calloc would be a good place to start...
For production code, definitely, add the error handling code. For unimportant, personal stuff, I'm sure we all cut corners from time to time.

In this case, unless I'm mistaken, the first calloc of the second loop iteration never returns. When it calls malloc, malloc aborts after detecting corruption caused by fseek writing to memory freed by fclose.

Regards,
Alister
# 7  
Old 06-24-2013
Quote:
Originally Posted by alister
For production code, definitely, add the error handling code. For unimportant, personal stuff, I'm sure we all cut corners from time to time.

In this case, unless I'm mistaken, the first calloc of the second loop iteration never returns. When it calls malloc, malloc aborts after detecting corruption caused by fseek writing to memory freed by fclose.

Regards,
Alister
It is still better to promote good coding practices IMO...be it dev or prod code among newbie developers otherwise old timers like me get stuck with a lot of cleanup...Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

FORTRAN error *** glibc detected ***

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: I'm doing aproximation of derivative called five-point stencil. For every value of x, in interval , in step... (0 Replies)
Discussion started by: antonija
0 Replies

2. Programming

C++ glibc detected double free or corruption(!prev) using shared library

Currently I test a shared library vendor provided in linux , the following is the simple source : #include <iostream> using namespace std; extern int test1(); extern int test2(); int main() { cout << "hello world" << endl ; return 0 ; cout << "Test 1" << endl; ... (6 Replies)
Discussion started by: barfatchen
6 Replies

3. Programming

*** glibc detected *** : malloc(): memory corruption (fast)

Hi Friends, while executing the below code, am getting *** glibc detected *** ./ok: malloc(): memory corruption (fast) error, please suggest how to solve this issue. #include <stdio.h> #include <string.h> #include <sqlca.h> #include <alloca.h> /* Define constants for VARCHAR... (2 Replies)
Discussion started by: mpjobsrch
2 Replies

4. Programming

glib detected: malloc() memory curruption

I am using libxml2 library for XMl parsing and libxml++ is C++ wrapper over that. So I am using API of libxml++. I am creating my class and composing instance xmlpp::Node *pNode in that. my class also have funciton prepareXPathQuery() which creates query string and have other fucntion... (2 Replies)
Discussion started by: sharadwagh
2 Replies

5. Programming

*** glibc detected *** ./a.out: malloc(): memory corruption (fast):

*** glibc detected *** ./a.out: malloc(): memory corruption (fast): Posted A minute ago M trying to make multiway tree and dont know what happend when this part of code get executed: 01void ins(NODE *ptr) 02{ 03 //working 04 if(ptr!=NULL) 05 { 06 SNODE *var=NULL; 07 var=(SNODE... (3 Replies)
Discussion started by: exgenome
3 Replies

6. Programming

./match_pattern.out: malloc(): memory corruption: 0x0000000013a11600 ***

Hi All, I have a simple code which does some computation by matching string patterns. In brief: 1. The code reads .dat and .txt files. 2. .dat files are huge text files and .txt files contain some important words. 3. I am just doing strstr to find the patterns. 4. The function returns the... (3 Replies)
Discussion started by: shoaibjameel123
3 Replies

7. Programming

solved: glibc detection corruption using a fork in popen

Hi, I am having a hell of a time getting this to work. So basically, I have opened a popen to run a program that is going to prompt an action to occur half way through, when it gets to this I need to create a separate process and do some stuff, then return to the original process. This works... (0 Replies)
Discussion started by: imrank27
0 Replies

8. Programming

Why does this occur? *** glibc detected *** malloc(): memory corruption: 0x10013ff8 ***

there seems not to be error in this segment. In some computers, it can work well. But in others, it will give a failure. why it ocurrs and how to deal with it? in a function: if( *ver == NULL ) { *ver = (vertex *) malloc(sizeof(vertex)); //this line ... (17 Replies)
Discussion started by: cdbug
17 Replies

9. Programming

Pointer to a struct (with pointers) *** glibc detected *** double free

I am using a structure defined as follows struct gene_square { double *x; double *y; };I have class, with a member function which is a pointer of this type: gene_square* m_Genes;I am allocating memory in the constructors like this: m_Genes = new gene_square; for (ii=0;... (1 Reply)
Discussion started by: jatoo
1 Replies

10. Programming

*** glibc detected *** double free or corruption: 0x40236ff4 ***

when i try to use the class i wrote, i either get this: *** glibc detected *** double free or corruption: 0x40236ff4 *** and the proccess exits with an error code of 0; or it segfaults. could someone look at my header file (with imp.) to give me some insight as to why its not working? ... (19 Replies)
Discussion started by: norsk hedensk
19 Replies
Login or Register to Ask a Question