I have been professionally coding in C for a while but am still stumped by some pointer related questions. I would really appreciate SO community's help in understanding below problem.
Following code crashed and generated core file.
void func1() // Frame 1 in GDB stack trace.
{
UTYPE *ptr; // pointer to user defined type
...
// data is of type UTYPE and has valid contents.
// lets say its address is 0x100
ptr = &data; --- (1)
...
func2(ptr); --- (2)
...
}
void func2(UTYPE *inp) // Frame 0 in GDB stack trace.
{
if(!inp) --- (3)
return;
...
// another_ptr is of UTYPE * which is a NULL.
inp = another_ptr; ---- (4)
/* Did not check for NULL and dereference inp and CRASH */ ---- (5)
}
Simplified backtrace from GDB:
Frame 0:
func2(inp = 0x0)
// crash at line (5) due to dereference
Frame 1:
func1: func2(0x0)
// `ptr` at line (2) is 0x0. Why is this so?
Why is ptr shown as 0x0 (NULL) in Frame 1?
When func2() is called, its call stack looks as follows:
| //local vars |
| |
| another_ptr = |
| NULL |
+---------------+
| return addr |
+---------------+
| input args |
| copy of ptr |
| contents |
| 0x100 |
For func1(), its call stack should look like:
| |
| ptr = 0x100 |
| |
+---------------+
| return addr |
+---------------+
| input args |
| none in this |
| func |
When inp becomes NULL in func2() in line (4), how is it reflected in func1()?
func1() at thelinenumberoflocationlabeled(2)and not display the call tofunc2. Are you using thebtcommand or something else?btcommand. It prints all stack frames and not just Frame 1. My representation of GDB backtrace above is just to help explain my question. Please let me know if something is amiss.btcommand displays a Frame 0 with a call tofunc2()and a Frame 1 with a call tofunc1. Its display of Frame 1 does not show a call tofunc2as yours does. I'm just having trouble reproducing your exact problem.