strcmp behaviour
Asked Answered
B

3

14

When I run the following code:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    p = strcmp(NULL,"foo");

    return 0;
}

I get segmentation fault. echo $? says 139. But when I run

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    strcmp(NULL,"foo"); // Note removed assignment

    return 0;
}

I don't get any segmentation fault. Could someone please throw some light?

Here is my gcc info:

> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
Barricade answered 8/2, 2011 at 12:14 Comment(0)
J
30

You are probably using optimization options when compiling. Since the result of strcmp() in the second snippet is ignored the compiler eliminates this function call and this is why your program does not crash. This call can be eliminated only because strcmp() is an intrinsic function, the compiler is aware that this function does not have any side effects.

Jorge answered 8/2, 2011 at 12:22 Comment(2)
Well, I did not do any compiler settings to turn on optimization, however it does it automatically. You were spot on.Barricade
gcc does SSA which works even with no optimizations enabled. SSA can remove dead code. en.wikipedia.org/wiki/Static_single_assignment_formJorge
D
6

You need to:

  • Include the proper headers, or declare functions manually. For strcmp(), you need <string.h>.
  • Not pass an invalid pointer such as NULL to strcmp(), since it doesn't protect against it and will dereference the pointer, thus causing undefined behavior in your program.
Dedicate answered 8/2, 2011 at 12:22 Comment(1)
The OP knows that NULL is invalid, but is asking why the two cases are different.Doiron
V
3

What you are doing is undefined. strcmp requires valid pointers to null-terminated strings.

NULL is not a pointer to a null-terminated string.

Velvetvelveteen answered 8/2, 2011 at 12:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.