Where is the value getting initialized in this case

Discussion in 'C Programming' started by Chad, Sep 18, 2007.

  1. Chad

    Chad Guest

    In the following code snippet, the value of 'lin' is somehow gettng
    intialized to the value of 1.

    int main(argc, argv)
    int argc;
    char **argv;
    {
    int err, tflg = 0, wflg = 0, slen, wr,
    sum = 0, in, rflg = 0, i, j, lin, waiting = 0;
    char str[256];

    memset(str, '\t', sizeof (str));

    slen = sizeof (str);

    while ((err = getopt(argc, argv, "t:s:wrp:")) != -1)
    switch (err) {
    case 't':
    tflg = 1;
    strncpy(tsk[0].u.ut_line, optarg, sizeof
    (tsk[0].u.ut_line));
    break;

    case 's':
    strncpy(str, optarg, sizeof (str));
    slen = strlen(str);
    break;

    case 'w':
    wflg = 1;
    break;

    case 'r':
    rflg = 1;
    break;

    case 'p':
    #ifndef BSD
    fprintf (stderr, "warn: this feature isn't
    available"
    "under this OS\n");
    exit (1);
    #endif
    ptitle (optarg);
    break;

    case '?':

    default :
    usage();
    }
    argc -= optind;
    argv += optind;

    There is no other place were the value of 'lin' is used. Later on in
    main(), the author starts to compare the value of 'lin'. This is what
    struck my curiosity in the first place. It appears that he was
    comparing the unitialized value of 'lin' to numbers.

    However, when i step throug the debugger, I see the following:
    Breakpoint 1, main (argc=4, argv=0xcfbdafac) at no.c:243
    243 {
    (gdb) display lin
    1: lin = -809652604
    (gdb) step

    Breakpoint 2, main (argc=4, argv=0xcfbdafac) at no.c:244
    244 int err, tflg = 0, wflg = 0, slen, wr,
    1: lin = 1

    Is there somewhere else I should try to look in the program? Or is
    this just possibly undefined behavior?

    Chad
     
    Chad, Sep 18, 2007
    #1
    1. Advertising

  2. Chad <> writes:

    > In the following code snippet, the value of 'lin' is somehow gettng
    > intialized to the value of 1.
    >
    > int main(argc, argv)
    > int argc;
    > char **argv;
    > {
    > int err, tflg = 0, wflg = 0, slen, wr,
    > sum = 0, in, rflg = 0, i, j, lin, waiting = 0;
    > char str[256];
    >
    > memset(str, '\t', sizeof (str));
    >
    > slen = sizeof (str);


    This is wrong. After filling str with 256 tabs it is not a string (no
    null) so strlen(str) is an error.

    >
    > while ((err = getopt(argc, argv, "t:s:wrp:")) != -1)
    > switch (err) {
    > case 't':
    > tflg = 1;
    > strncpy(tsk[0].u.ut_line, optarg, sizeof
    > (tsk[0].u.ut_line));


    This may be OK provided you don't assume tsk[0].u.ut_line is a string.

    > break;
    >
    > case 's':
    > strncpy(str, optarg, sizeof (str));
    > slen = strlen(str);


    This code is wrong, though it may not be going wrong in any particular
    execution of the program -- unlike the memset/strlen problem above
    which always provokes undefined behaviour.

    <snip>
    > However, when i step throug the debugger, I see the following:
    > Breakpoint 1, main (argc=4, argv=0xcfbdafac) at no.c:243
    > 243 {
    > (gdb) display lin
    > 1: lin = -809652604
    > (gdb) step
    >
    > Breakpoint 2, main (argc=4, argv=0xcfbdafac) at no.c:244
    > 244 int err, tflg = 0, wflg = 0, slen, wr,
    > 1: lin = 1


    A small, complete example of the problem would be more useful than a
    fragment and some debugger output -- and in trying to make such an
    example you will often find the problem yourself.

    --
    Ben.
     
    Ben Bacarisse, Sep 18, 2007
    #2
    1. Advertising

  3. Ben Bacarisse said:

    > Chad <> writes:
    >

    <snip>
    >> slen = sizeof (str);

    >
    > This is wrong. After filling str with 256 tabs it is not a string (no
    > null) so strlen(str) is an error.


    That doesn't look like strlen to me.

    --
    Richard Heathfield <http://www.cpax.org.uk>
    Email: -www. +rjh@
    Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
    "Usenet is a strange place" - dmr 29 July 1999
     
    Richard Heathfield, Sep 18, 2007
    #3
  4. Richard Heathfield <> writes:

    > Ben Bacarisse said:
    >
    >> Chad <> writes:
    >>

    > <snip>
    >>> slen = sizeof (str);

    >>
    >> This is wrong. After filling str with 256 tabs it is not a string (no
    >> null) so strlen(str) is an error.

    >
    > That doesn't look like strlen to me.


    Not to me, now. I have no idea what I was thinking! It it slightly
    peculiar code, but not actually wrong.

    --
    Ben.
     
    Ben Bacarisse, Sep 18, 2007
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. mohan
    Replies:
    2
    Views:
    316
    Richard Bos
    Nov 10, 2003
  2. mohan
    Replies:
    2
    Views:
    340
    Andreas Kahari
    Nov 9, 2003
  3. ankur
    Replies:
    32
    Views:
    879
    Martin Gregorie
    Nov 26, 2008
  4. ankur
    Replies:
    2
    Views:
    2,433
    ankur
    Feb 23, 2009
  5. Rahul
    Replies:
    7
    Views:
    133
    Anthony Jones
    May 11, 2006
Loading...

Share This Page