Why segmentation(coredump) in the following code in C?


 
Thread Tools Search this Thread
Top Forums Programming Why segmentation(coredump) in the following code in C?
# 1  
Old 06-13-2011
Why segmentation(coredump) in the following code in C?

hi
I have a method which returns char*. In this method am using switch case. I am getting segmentation error in case 49 and my code is
Code:
case 49:
          if(intFlag == 0210)
          {
                iiIDCode = atoi(getsubstring(sReq,262,2));
                l = atoi(getsubstring(sReq,26+2+iiIDCode,3));
                iiTemp = 26+2+iiFIDCode+l+3;
                j = atoi(getsubstring(sReq,iiTemp,3));
                k  = atoi(getsubstring(sReq,iiTemp+j+3,3));
                fprintf(fp,"\nCurrency Code Transaction:\t\t[%s]",getsubstring       (sReq,iiTemp+j+k+3+3,3));
                strcat(cRes,getsubstring(sReq,iiTemp+j+k+3+3,3));;
          }
         else if(intFlag == 110)
         {
          }   
break;

getsubstring is a method am using to substring the string and it is working fine. If i remove if and else part it is working fine but if i add if else condition in case 49: it is throwing error Segmentation Coredump. Why? What could be the error? How to solve this?
Thanks
# 2  
Old 06-13-2011
As a guess - strcat(). cRes is not large enough to have extra characters added on the end.

Best idea - compile with the -g flag. When a core dumpp occurs use the debugger:
gdb example
Code:
gdb myfile core
> ba

ba will print the current stack with line numbers. I am betting on the line with strcat() as the culprit.

Last edited by jim mcnamara; 06-13-2011 at 11:51 AM..
# 3  
Old 06-14-2011
I faced the same problem couple of days back.
Either you are using strcat directly on cRes without initialising cRes or cRes is not a char array.
# 4  
Old 06-14-2011
hi All
This is the way i have declared cRes. sReq is very large string and i declared sRes as char sRes[2500] which is global.

char* cRes;
cRes = (char*) malloc(5 + sizeof(sReq));

What could be the problem?
Thanks
# 5  
Old 06-14-2011
Did you analyze the core file.

strcat() will start appending the second string from the end of the first string.

So if cRes is already holding anything more than 5 chars before strcat(), then there may not be enough room to copy the substring of cReq.


What i guess is, as your method returning char *, and if the control goes in to else part, it may be the case that you are returning the invalid pointer.

So check for the return value usage, what is happening with the return value of your method.

segmentation fault can happen for thousands of reason, you need to analyze what cuasing it.
use
Code:
gdb a.out core


Last edited by kumaran_5555; 06-14-2011 at 05:39 AM..
# 6  
Old 06-14-2011
hi
Please go through my complete code and help me out to solve it.

#define MYSPACE "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
char* GetResponsePrimaryElements(char cResBinary[])
{
int i, j, k,l;
int intTranFlag = iTranFlag;
int iiTemp;
int iiFIDCode;
char* cRes;
cRes = (char*) malloc(1550 * sizeof(MYSPACE));
for(i=0;i<strlen(cResBinary);i++)
{
if(cResBinary[i]=='1')
{
switch(i+1)
{
case 1:
fprintf(fp,"\nSecondary:\t\t\t[%s]", getsubstring(sReq,20,16));
if(intTranFlag == 0210)
strcat(cRes,"0210");
else if(intTranFlag == 0110)
strcat(cRes,"0110");
strcat(cRes,getsubstring(sReq,4,16));
strcat(cRes,getsubstring(sReq,20,16));
iLength = 36;
break;
case 2:
fprintf(fp,"\n Number:\t\t\t\t[%s]", getsubstring(sReq,iLength,20));
strcat(cRes,getsubstring(sReq,iLength,20));
iLength = iLength + 20;
break;
case 3:
fprintf(fp,"\nCode:\t\t\t\t[%s]", getsubstring(sReq,iLength,6));
strcat(cRes,getsubstring(sReq,iLength,6));
iLength = iLength + 6;
break;
case 4:
fprintf(fp,"\nAmount:\t\t\t[%s]", getsubstring(sReq,iLength,12));
strcat(cRes,getsubstring(sReq,iLength,12));
iLength = iLength + 12;
break;
case 5:
fprintf(fp,"\nAmount:\t\t\t[%s]", getsubstring(sReq,iLength,12));
strcat(cRes,getsubstring(sReq,iLength,12));
iLength = iLength + 12;
break;
case 6:
fprintf(fp,"\nAmount,:\t\t[%s] ", getsubstring(sReq,iLength,12));
strcat(cRes,getsubstring(sReq,iLength,12));
iLength = iLength + 12;
break;
case 7:
fprintf(fp,"\nDate:\t\t[%s] ", getsubstring(sReq,iLength,10));
strcat(cRes,getsubstring(sReq,iLength,10));
break;
case 10:
if(intTranFlag == 0110)
{
fprintf(fp,"\nRate:\t[%s]", getsubstring(sReq,iLength,15));
strcat(cRes,getsubstring(sReq,iLength,15));
}
break;
case 11:
fprintf(fp,"\nAudit Number:\t\t[%s]", getsubstring(sReq,123,6));
strcat(cRes,getsubstring(sReq,123,6));
break;
case 15:
fprintf(fp,"\nDate\t\t\t[####]");
strcat(cRes,"####");
break;
case 18:
if(intTranFlag == 0110)
{
fprintf(fp,"\nType:\t\t\t\t[%s]", getsubstring(sReq,153,4));
strcat(cRes,getsubstring(sReq,153,4));
}
break;
case 19:
fprintf(fp,"Code:\t[%s]", getsubstring(sReq,153,3));
strcat(cRes,getsubstring(sReq,153,3));
break;
case 21:
fprintf(fp,"\nCode:\t[%s]", getsubstring(sReq,156,3));
strcat(cRes,getsubstring(sReq,156,3));
break;
case 28:
fprintf(fp,"\nDate:\t\t[####]");
strcat(cRes,"####");
break;
case 32:
iiTemp = atoi(getsubstring(sReq,209,2));
strcat(cRes,getsubstring(sReq,209,2));
if(iiTemp <= 11)
{
fprintf(fp,"\n Code:\t\t[%s]", getsubstring(sReq,209+2,iiTemp));
strcat(cRes,getsubstring(sReq,209+2,iiTemp));
}
else
fprintf(fp,"\n*** Length violates maximum length of Bit 32 ***");
break;
case 33:
iiFIDCode = atoi(getsubstring(sReq,209+2+iiTemp,2));
strcat(cRes,getsubstring(sReq,209+2+iiTemp,2));
if(iiFIDCode <= 11)
{
fprintf(fp,"\nCode:\t\t[%s]", getsubstring(sReq,209+2+iiTemp,iiFIDCode));
strcat(cRes,getsubstring(sReq,209+2+iiTemp,iiFIDCode));
iiFIDCode = 209 + 2 + 2 + iiTemp + iiFIDCode;
}
else
fprintf(fp,"\n*** Length violates maximum length of Bit 33 ***");
break;
case 37:
fprintf(fp,"\n Number:\t\t[%s]", getsubstring(sReq,iiFIDCode,12));
strcat(cRes,getsubstring(sReq,iiFIDCode,12));
break;
case 38:
fprintf(fp,"\n Response:\t[######]");
strcat(cRes,"######");
break;
case 39:
fprintf(fp,"\nAction :\t\t[##]");
strcat(cRes,"##");
break;
case 41:
fprintf(fp,"\nCard :\t\t[%s]", getsubstring(sReq,231,16));
strcat(cRes,getsubstring(sReq,231,16));
break;
case 42:
fprintf(fp,"\nCard:\t[%s]", getsubstring(sReq,247,15));
strcat(cRes,getsubstring(sReq,247,15));
break;
case 48:
fprintf(fp,"\nAdditional Data:\t\t\t[############################]");
strcat(cRes,"###");
break;
case 49:
if(intTranFlag == 0210) /* Here am getting error, if i remove if condition it is working fine */
{
iiFIDCode = atoi(getsubstring(sReq,262,2));
l = atoi(getsubstring(sReq,262+2+iiFIDCode,3));
iiTemp = 262+2+iiFIDCode+l+3;
j = atoi(getsubstring(sReq,iiTemp,3));
k = atoi(getsubstring(sReq,iiTemp+j+3,3));
fprintf(fp,"\nCurrency Code Transaction:\t\t[%s]",getsubstring(sReq,iiTemp+j+k+3+3,3));
strcat(cRes,getsubstring(sReq,iiTemp+j+k+3+3,3));;
}
break;
case 50:
fprintf(fp,"\nCurrency:\t\t[%s]",getsubstring(sReq,iiTemp+j+k+3+3+3,3));
strcat(cRes,getsubstring(sReq,iiTemp+j+k+3+3+3,3));
break;
case 51:
fprintf(fp,"\nCurrency Code Billing:\t\t\t[%s]",getsubstring(sReq,iiTemp+j+k+3+3+3+3,3));
strcat(cRes,getsubstring(sReq,iiTemp+j+k+3+3+3+3,3));
break;
case 54:
fprintf(fp,"\nAm:\t\t\t[######]");
strcat(cRes,"######");
break;
case 62:
fprintf(fp,"\nAm:\t\t\t[%s]", getsubstring(sReq,iiTemp+j+k+3+3+3+3+3+16,12));
strcat(cRes,getsubstring(sReq,iiTemp+j+k+3+3+3+3+3+16,12));
break;
case 64:
fprintf(fp,"\nCurrency:\t\t[%s]", getsubstring(sReq,iiTemp+j+k+3+3+3+3+3+16+12,3));
strcat(cRes,getsubstring(sReq,iiTemp+j+k+3+3+3+3+3+16+12,3));
intTemp = iiTemp+j+k+3+3+3+3+3+16+12+3;
break;
default:
break;
}
}
}
}
return cRes;
}

when i used gdb a.out core
I got this message
Program terminated with signal 11, Segmentation fault.
(no debugging symbols found)...(no debugging symbols found)...#0 0xd03caa24 in strnlen ()
What is this error?

Last edited by AAKhan; 06-14-2011 at 07:00 AM..
# 7  
Old 06-14-2011
compile your program with -g option and then execute, gdb.

I think you have posted only the one function, the problem could be even at the callee side, how the return value is being used there.

So try gdb and let us know, what you see.

the gdb says that the segmentation fault occurred in strnlen() , strnlen(3) - Linux man page

Check for such functions.
This User Gave Thanks to kumaran_5555 For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Programming

Why does this example C code run and yet SHOULD either not compile or give a segmentation fault?

Apologies for any typos... Well guys, been researching 'goto' in C and they say that you can't 'goto' labels in another function as a segmentation fault will occur. However I have found a way to 'goto' a label in another function that is NOT main() using the asm() function. As you know I... (14 Replies)
Discussion started by: wisecracker
14 Replies

2. Programming

This code keeps giving me a segmentation fault why?

#include<stdlib.h> #include <pthread.h> #include "tlpi_hdr.h" #include <stdio.h> static volatile int glob = 0; static struct { pthread_t t1,t2; } *thread; static void * /* Loop 'arg' times incrementing 'glob' */ threadFunc(void *arg) { int loops = *((int *) arg); ... (1 Reply)
Discussion started by: fwrlfo
1 Replies

3. Programming

this code for addind polynomials using linked lists showed segmentation error..any help pls..

the error occurs in the function() "add" used... #include<stdio.h> #include<malloc.h> struct node { int exp; int coef; struct node * link; }; struct node * create_list(struct node *,int,int); void display(struct node *); struct node * add(struct node *,struct node *); ... (3 Replies)
Discussion started by: mscoder
3 Replies

4. Programming

C code : Segmentation fault

Hi Friends, I have written a small code in C which performs the below operations Task : 1 ) read line by line from a file. 2 ) assuming 3th and 4th fields of the file as GN and GNTO 3 ) The target file should contain all the fields except GNTO. 4... (3 Replies)
Discussion started by: kiran_bhatter
3 Replies

5. AIX

Segmentation fault in nsgetcinfo in aix 64-bit c code

Hello, I am running on a AIX5.2 server with Oracle 10g and 9i. My code compiles and works fine in 32-bit mode. The same code compiles in 64-bit and runs good. The program catches CNTRL-C signal to terminate. Only on 64-bit code when i hit CNTRL-C, the program exits with segmentation... (0 Replies)
Discussion started by: sumesh0710
0 Replies

6. Shell Programming and Scripting

Segmentation Fault(coredump)

I'm getting this error when trying to run a Acucobol program thru UNIX.. Segmentation Fault(coredump) Precompiler error prevents compilation of xxxxxx.co. Please help me in this case.. (1 Reply)
Discussion started by: Manish4
1 Replies

7. UNIX for Advanced & Expert Users

Segmentation (CoreDump) error !!

Hi all, I am trying to create few directories using script and its giving me segmentation error. #!/bin/ksh createDirectories() createDirectories() { cat dirs | \ while read line do mkdir... (16 Replies)
Discussion started by: varungupta
16 Replies

8. Solaris

lpstat gives segmentation coredump error

hi everyone, we have solaris 8 in sun v480 server. it gives this error. Segmentation Fault(coredump) can anyone help me in this - urgently. Regards Karthik C (8 Replies)
Discussion started by: cksriramchandra
8 Replies

9. AIX

Segmentation fault(coredump)

Hi All Can anybody help me? When ever am trying to run topas system gives me an error Segmentation fault(coredump) does anybody ahve solution for this? (4 Replies)
Discussion started by: vjm
4 Replies
Login or Register to Ask a Question