using gdb and stacktrace ??????

Discussion in 'C' started by bluesky, Oct 24, 2008.

  1. bluesky

    bluesky New Member

    Joined:
    Oct 24, 2008
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    void function(int a, int b, int c){
    char buffer1[5];
    char buffer2[10];
    int *r;
    r = buffer1 + 12;
    (*r) += 8;
    }
    int main(){
    int x = 0;
    function(1,2,3);
    x = 1;
    printf("x = %d\n", x);
    }

    Hi,

    I am new to this community and have joined recently. I am trying to run this program and on compiling it gives warning as "assignment from incompatible pointer type". I wanted to know why this happens that is the reason behind this warning?

    Also Besides i need to use a debugger such as gdb to find out why the program is outputting the current output of x=1? And how do i provide a memory dump of the stack? Also in my opinion the program should have given output as x=0 but it gave output as x=1? So how do i modify the program so that it gives the output as x=0?

    bluesky ;)
     
  2. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    The warning probably occurs on "r=buffer+12" - this is invalid because r is an int* and buffer is a char*. The reason this is a problem that may need pointing out is that buffer+12 may not do what you want; either it will evaluate to &buffer[12] which is (void*)(&buffer[0]+12), or it will evaluate to &buffer+12*sizeof(int) which is (void*)(&buffer[0]+12*sizeof int), depending on whether the compiler converts buffer to an int* before adding 12, or converts buffer+12 to an int*.

    Basically when you use a pointer to a bunch of objects, the compiler assumes that (pointer+1) means the next object, not literally the address of the object the pointer is currently pointing to plus 1. So int *p=1000; p++; will increase p to 1004 if sizeof int=4; struct s { ... } *p=1000; p++; will increase p by sizeof struct s. And char *p=1000; p++; will increase p to 1001.

    So by assigning a char* pointer to an int* you're immediately creating an ambiguity. Is buffer1 to be treated as an int* or a char*, and does +12 mean +12*sizeof char or +12*sizeof int? A cast will get rid of the problem, e.g. r = (int*)buffer +12; or r=(int*)(&buffer[12]);

    The program prints x=1 because that's what you're telling it to do. int x=0; x=1; printf("x=%d\n",x); will print x=1. You don't need a debugger to tell you that, just RTFC. To modify the program to print "x=0" just remove "x=1;".

    I think "where" is the command for printing a stack in gdb, but of course you need a core dump. Probably what you need is to step through the code rather than to get a stack. I tend to use Visual Studio so have limited experience with gdb.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice