unreferenced local variable

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Alzane

    #1

    unreferenced local variable

    I'm new to C++ programming. I have an exercise that I have written
    code for but getting warnings. Can I get some help?


    #include "stdafx.h"
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>


    int main(int argc, char* argv[])

    {
    char *StrNam1;
    char *StrNam2;

    StrNam2 = (char *) malloc (strlen (StrNam2) + 1);
    sprintf("%s%s", strcat
    ("..%2F..%2FCom mon%2FASP%2Fquo t_choose_lob.as p%3FSID%3D",
    "A3D6F20D-7091"));


    return 0;
    }

    Compiling...
    Concatenate.cpp
    C:\Program Files\Microsoft Visual
    Studio\MyProjec ts\dash2hex\Con catenate.cpp(10 ) : warning C4101:
    'StrNam1' : unreferenced local variable
    C:\Program Files\Microsoft Visual
    Studio\MyProjec ts\dash2hex\Con catenate.cpp(13 ) : warning C4700: local
    variable 'StrNam2' used without having been initialized
    Linking...

    Concatenate.exe - 0 error(s), 2 warning(s)
  • Ron Natalie

    #2
    Re: unreferenced local variable

    Alzane wrote:[color=blue]
    > I'm new to C++ programming. I have an exercise that I have written
    > code for but getting warnings. Can I get some help?
    >
    >
    > #include "stdafx.h"[/color]

    BOGUS include file.

    [color=blue]
    >
    > int main(int argc, char* argv[])
    >
    > {
    > char *StrNam1;[/color]
    You indeed don't use this anywhere, causing the first warning.
    [color=blue]
    > char *StrNam2;
    >
    > StrNam2 = (char *) malloc (strlen (StrNam2) + 1);[/color]

    At this point StrNam2 is set to some indeterminate value. What do
    you think passing it to strlen is going to do? The length of WHAT
    string?
    [color=blue]
    > sprintf("%s%s", strcat
    > ("..%2F..%2FCom mon%2FASP%2Fquo t_choose_lob.as p%3FSID%3D",
    > "A3D6F20D-7091"));
    >[/color]
    This isn't how sprintf works at all. The first arg to sprintf has
    to be a char* that points to some allcoated memory that the printf()
    results will be written too.

    The second arg is the format string. And you strcat doesn't work
    the way you think it should either.

    At this point, you probably should stay away from C's hiddeous attempt
    to implement strings as character arrays and just use C++'s string type.

    #include <string>
    int main() {
    std::string StrNam2 = "..%2F..dkafjkj dflasdkjf";
    StrNam2 += "A3D6F20D-7091";

    }

    Comment

    • Victor Bazarov

      #3
      Re: unreferenced local variable

      Alzane wrote:[color=blue]
      > I'm new to C++ programming. I have an exercise that I have written
      > code for but getting warnings. Can I get some help?
      >
      >
      > #include "stdafx.h"
      > #include <string.h>
      > #include <stdio.h>
      > #include <stdlib.h>
      >
      >
      > int main(int argc, char* argv[])
      >
      > {
      > char *StrNam1;[/color]

      You declared the pointer 'StrNam1' but never use it in the program.
      That's why the compiler warns you.
      [color=blue]
      > char *StrNam2;
      >
      > StrNam2 = (char *) malloc (strlen (StrNam2) + 1);[/color]

      What are you trying to do here? 'StrNam2' has no value given to it.
      You're trying to find its length by calling 'strlen'. That's the
      second warning you get. Anyway, that's not the right way to manage
      your memory. If you want to allocate some memory and store the pointer
      to it in 'StrNam2', you need to give it some meaningful size. What is
      the purpose of 'StrNam2'?
      [color=blue]
      > sprintf("%s%s", strcat
      > ("..%2F..%2FCom mon%2FASP%2Fquo t_choose_lob.as p%3FSID%3D",
      > "A3D6F20D-7091"));[/color]

      'sprintf' is supposed to have the string where you want the result as
      the very first argument. The format is the _second_ argument. RTFM.

      'strcat' is used incorrectly. If you just want to have two literals
      live on two different lines of code but represent the same string, you
      can simply leave whitespace between them:

      "..%2F..%2FComm on%2FASP%2Fquot _choose_lob.asp %3FSID%3D"
      "A3D6F20D-7091"

      No commas, no 'strcat' calls. 'strcat' requires the first argument to
      be the _resulting_ buffer. If you pass a literal as the first argument,
      you're asking for trouble. RTFM.
      [color=blue]
      >
      >
      > return 0;
      > }
      >
      > Compiling...
      > Concatenate.cpp
      > C:\Program Files\Microsoft Visual
      > Studio\MyProjec ts\dash2hex\Con catenate.cpp(10 ) : warning C4101:
      > 'StrNam1' : unreferenced local variable
      > C:\Program Files\Microsoft Visual
      > Studio\MyProjec ts\dash2hex\Con catenate.cpp(13 ) : warning C4700: local
      > variable 'StrNam2' used without having been initialized
      > Linking...
      >
      > Concatenate.exe - 0 error(s), 2 warning(s)[/color]

      V

      Comment

      • Mike Wahler

        #4
        Re: unreferenced local variable


        "Alzane" <azpony94@juno. com> wrote in message
        news:379d98c1.0 411291206.778ed a64@posting.goo gle.com...[color=blue]
        > I'm new to C++ programming. I have an exercise that I have written
        > code for but getting warnings. Can I get some help?
        >
        >
        > #include "stdafx.h"[/color]

        This is a nonstandard header. Please omit such from
        code posted here. You don't need this anyway.
        [color=blue]
        > #include <string.h>
        > #include <stdio.h>
        > #include <stdlib.h>
        >
        >
        > int main(int argc, char* argv[])
        >
        > {
        > char *StrNam1;
        > char *StrNam2;[/color]

        You've just defined two pointers. Since you did not initialize them,
        their values are indetermindate, unknown. I.e. these pointers don't
        point anywhere.
        [color=blue]
        >
        > StrNam2 = (char *) malloc (strlen (StrNam2) + 1);[/color]

        Here you pass an ininitalizaed pointer ('StrNam2') to a function
        ('strlen()'), which expects a valid pointer to a zero-terminated
        array of characters. The resulting behavior is undefined. If you
        want to compute the length of a string, first you need a string.

        You also need to check 'malloc()'s return value to see if it
        failed (returns NULL in that case).

        You never subsequently use 'StrNam2' in your program anyway,
        so I'm not sure what your trying to do. Perhaps if you
        explain that, I could offer more specific advice.
        [color=blue]
        > sprintf("%s%s", strcat
        > ("..%2F..%2FCom mon%2FASP%2Fquo t_choose_lob.as p%3FSID%3D",
        > "A3D6F20D-7091"));[/color]

        Here's another case of undefined behavior. 'strcat()' will attempt
        to modify the string pointed to by its first parameter. But you give
        a pointer to a string literal, which the language prohibits modifying.

        Another 'undefined' aspect of this is that you've given 'printf()'
        two format specifiers ('%s'), but only one corresponding argument.

        If you want to concatentate two strings, you need a place to store
        the resulting string. (This could be the string being lengthened,
        if sufficient storage has been allocated for it).
        [color=blue]
        >
        >
        > return 0;
        > }
        >
        > Compiling...
        > Concatenate.cpp
        > C:\Program Files\Microsoft Visual
        > Studio\MyProjec ts\dash2hex\Con catenate.cpp(10 ) : warning C4101:
        > 'StrNam1' : unreferenced local variable[/color]

        This is harmless. It simply means you've created an object an
        never used it. Use modern C++ and forget that low-level memory
        management you've tried above.


        -Mike
        [color=blue]
        > C:\Program Files\Microsoft Visual
        > Studio\MyProjec ts\dash2hex\Con catenate.cpp(13 ) : warning C4700: local
        > variable 'StrNam2' used without having been initialized[/color]

        This is the real problem.


        Since none of what you wrote above enough sense for me to
        try to guess what you're trying to do, I can only offer this
        simple C++ program which outputs the result of concatenating
        two strings.


        #include <iostream>
        #include <string>

        int main()
        {
        std::string StrNam1("Hello ");
        std::string StrNam2("world" );
        std::cout << StrNam1 + StrNam2 << '\n';
        return 0;
        }

        -Mike


        Comment

        • Default User

          #5
          Re: unreferenced local variable

          Alzane wrote:
          [color=blue]
          > I'm new to C++ programming. I have an exercise that I have written
          > code for but getting warnings. Can I get some help?
          >
          >
          > #include "stdafx.h"[/color]

          The above header is non-standard.
          [color=blue]
          > #include <string.h>
          > #include <stdio.h>
          > #include <stdlib.h>[/color]

          While technically C++ headers, they are provided mostly for
          compatibility with C. You should probably not be using them.
          [color=blue]
          >
          > int main(int argc, char* argv[])[/color]

          As you don't use the args in main(), you should leave them out.
          [color=blue]
          > {
          > char *StrNam1;
          > char *StrNam2;[/color]

          It's a poor idea for a beginner to use pointers in learning programs.
          [color=blue]
          > StrNam2 = (char *) malloc (strlen (StrNam2) + 1);[/color]

          StrNam2 was not initialized. What did you think the result of getting
          the string length of it would be? What it is in Undefined Behavior, a
          Very Bad Thing.

          Also, malloc() is generally not used in C++ programming.
          [color=blue]
          > sprintf("%s%s", strcat
          > ("..%2F..%2FCom mon%2FASP%2Fquo t_choose_lob.as p%3FSID%3D",
          > "A3D6F20D-7091"));[/color]

          You don't know how to use sprintf() at all. The arg count is wrong.
          Also, your use of strcat() modifies a string literal. Undefined
          Behavior again.
          [color=blue]
          >
          > return 0;[/color]

          You got this right.
          [color=blue]
          > }
          >
          > Compiling...
          > Concatenate.cpp
          > C:\Program Files\Microsoft Visual
          > Studio\MyProjec ts\dash2hex\Con catenate.cpp(10 ) : warning C4101:
          > 'StrNam1' : unreferenced local variable[/color]

          You didn't use StrNam1.
          [color=blue]
          > C:\Program Files\Microsoft Visual
          > Studio\MyProjec ts\dash2hex\Con catenate.cpp(13 ) : warning C4700: local
          > variable 'StrNam2' used without having been initialized[/color]

          This is the far more dangerous problem.


          What book are you using? This is a mishmashed, dangerous piece of
          essentially C code.

          Get a good book, one using modern C++, then read it. Otherwise, you're
          wasting your time and ours.



          Brian

          Comment

          • Method Man

            #6
            Re: unreferenced local variable


            "Alzane" <azpony94@juno. com> wrote in message
            news:379d98c1.0 411291206.778ed a64@posting.goo gle.com...[color=blue]
            > I'm new to C++ programming. I have an exercise that I have written
            > code for but getting warnings. Can I get some help?
            >
            >
            > #include "stdafx.h"
            > #include <string.h>
            > #include <stdio.h>
            > #include <stdlib.h>
            >
            >
            > int main(int argc, char* argv[])
            >
            > {
            > char *StrNam1;
            > char *StrNam2;
            >
            > StrNam2 = (char *) malloc (strlen (StrNam2) + 1);
            > sprintf("%s%s", strcat
            > ("..%2F..%2FCom mon%2FASP%2Fquo t_choose_lob.as p%3FSID%3D",
            > "A3D6F20D-7091"));
            >
            >
            > return 0;
            > }[/color]


            A couple more suggestions:

            1. Don't cast the result of malloc, it can be unsafe.
            2. For every malloc(), make sure to have a corresponding free() call. It's
            better to be safe and manage your own memory.

            Note: The above looks like C code. A good book on C or C++ would help you
            with your exercise much more.


            Comment

            • Ron Natalie

              #7
              Re: unreferenced local variable

              Method Man wrote:
              =[color=blue]
              >
              > A couple more suggestions:
              >
              > 1. Don't cast the result of malloc, it can be unsafe.[/color]

              You have to cast the result of malloc. There is no implicit
              conversion from void* in C++.

              [color=blue]
              > 2. For every malloc(), make sure to have a corresponding free() call. It's
              > better to be safe and manage your own memory.[/color]

              True, but it would be better to avoid user-managed dynamic allocations
              here entirely. That would have avoided 90% of the problems.

              Comment

              • Alzane

                #8
                Re: unreferenced local variable

                Thanks to you all for you explanations. I'm going through this book
                called "C Programming for the Absolute Beginner", which as you can see
                is definitely me, but I have this person who trying to get me up to
                speed with some exercises. I agree I should study more. If you have
                any suggestion of a good C Programming book, please advise.

                Comment

                • Default User

                  #9
                  Re: unreferenced local variable

                  Ron Natalie wrote:
                  [color=blue]
                  > Method Man wrote:
                  > =[color=green]
                  > >
                  > > A couple more suggestions:
                  > >
                  > > 1. Don't cast the result of malloc, it can be unsafe.[/color]
                  >
                  > You have to cast the result of malloc. There is no implicit
                  > conversion from void* in C++.[/color]

                  Yep, MM is thinking of C. In C++, not only is the cast required but the
                  "C problem" of implicit declaration of undeclared functions doesn't
                  exist either.
                  [color=blue][color=green]
                  > > 2. For every malloc(), make sure to have a corresponding free()
                  > > call. It's better to be safe and manage your own memory.[/color]
                  >
                  > True, but it would be better to avoid user-managed dynamic allocations
                  > here entirely. That would have avoided 90% of the problems.[/color]

                  I agree. Newbies to C++ should be starting out with containers. Once a
                  firm grasp of programming is established, then dynamic memory can be
                  tackled.



                  Brian

                  Comment

                  • Default User

                    #10
                    Re: unreferenced local variable

                    Alzane wrote:
                    [color=blue]
                    > Thanks to you all for you explanations. I'm going through this book
                    > called "C Programming for the Absolute Beginner", which as you can see
                    > is definitely me, but I have this person who trying to get me up to
                    > speed with some exercises. I agree I should study more. If you have
                    > any suggestion of a good C Programming book, please advise.[/color]

                    Why are you posting to a C++ newsgroup, when you are attempting to
                    learn C? Many of the comments you received were inappropriate in the
                    context of a review of a C program (although many others were the same).

                    You should be using comp.lang.c.




                    Brian

                    Comment

                    • Method Man

                      #11
                      Re: unreferenced local variable


                      "Default User" <first.last@boe ing.com.invalid > wrote in message
                      news:I8075p.F9z @news.boeing.co m...[color=blue]
                      > Ron Natalie wrote:
                      >[color=green]
                      > > Method Man wrote:
                      > > =[color=darkred]
                      > > >
                      > > > A couple more suggestions:
                      > > >
                      > > > 1. Don't cast the result of malloc, it can be unsafe.[/color]
                      > >
                      > > You have to cast the result of malloc. There is no implicit
                      > > conversion from void* in C++.[/color]
                      >
                      > Yep, MM is thinking of C. In C++, not only is the cast required but the
                      > "C problem" of implicit declaration of undeclared functions doesn't
                      > exist either.
                      >[/color]

                      Thanks, I wasn't aware of that. Personally, I've never had to use malloc()
                      in a C++ program yet.


                      Comment

                      • Method Man

                        #12
                        Re: unreferenced local variable


                        "Default User" <first.last@boe ing.com.invalid > wrote in message
                        news:I80BK6.K0H @news.boeing.co m...[color=blue]
                        > Alzane wrote:
                        >[color=green]
                        > > Thanks to you all for you explanations. I'm going through this book
                        > > called "C Programming for the Absolute Beginner", which as you can see
                        > > is definitely me, but I have this person who trying to get me up to
                        > > speed with some exercises. I agree I should study more. If you have
                        > > any suggestion of a good C Programming book, please advise.[/color]
                        >
                        > Why are you posting to a C++ newsgroup, when you are attempting to
                        > learn C? Many of the comments you received were inappropriate in the
                        > context of a review of a C program (although many others were the same).
                        >
                        > You should be using comp.lang.c.
                        >[/color]

                        Yes. C and C++ are two different languages and it is a waste of people's
                        time to analyze code for one language when you are referring to another.


                        Comment

                        Working...