What could the compiler be possibly complaining about

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • parag_paul@hotmail.com

    #1

    What could the compiler be possibly complaining about

    Are there any compiler groups.
    Though I try it in this language forum
    I got the following message for the following line in a c file

    if (logic_value_ch ange == p_variable_info->vc_reason &&
    p_variable_info->p_value->logic_value <4 &&
    p_variable_info->p_value->logic_value>=0 )



    The message is
    .../star186559.c: In function `func_var':
    .../star186559.c:32 0: warning: comparison is always true due to limited
    range of data type



    comparison is always true ????

    The data type fpr logic_value is a unsigned char
    -Parag
  • Richard Heathfield

    #2
    Re: What could the compiler be possibly complaining about

    parag_paul@hotm ail.com said:
    Are there any compiler groups.
    Yes, but you don't need one for this question, which is about the C
    language.
    Though I try it in this language forum
    I got the following message for the following line in a c file
    >
    if (logic_value_ch ange == p_variable_info->vc_reason &&
    p_variable_info->p_value->logic_value <4 &&
    p_variable_info->p_value->logic_value>=0 )
    >
    The message is
    ../star186559.c: In function `func_var':
    ../star186559.c:32 0: warning: comparison is always true due to limited
    range of data type
    >
    comparison is always true ????
    Yes.
    The data type fpr logic_value is a unsigned char
    An unsigned char cannot hold negative values. It can only hold values in
    the range 0 to UCHAR_MAX, which is guaranteed to be a positive integer
    value that is at least 255 (but is higher on some systems).

    The comparison you have is: p_variable_info->p_value->logic_value> =0

    Now, *any* unsigned char value *must* have a value greater than or equal to
    0, by definition. Therefore, the comparison >= 0 will always yield true
    for an unsigned char, which is exactly what the compiler is (correctly)
    telling you.

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

    Comment

    • Martin Ambuhl

      #3
      Re: What could the compiler be possibly complaining about

      parag_paul@hotm ail.com wrote:
      Are there any compiler groups.
      Though I try it in this language forum
      I got the following message for the following line in a c file
      >
      if (logic_value_ch ange == p_variable_info->vc_reason &&
      p_variable_info->p_value->logic_value <4 &&
      p_variable_info->p_value->logic_value>=0 )
      The message is
      .../star186559.c: In function `func_var':
      .../star186559.c:32 0: warning: comparison is always true due to limited
      range of data type
      comparison is always true ????
      The data type fpr logic_value is a unsigned char
      The comparison
      p_variable_info->p_value->logic_value>=0 )
      is obviously always true if logic_value is an unsigned char.
      An unsigned char cannot be less than zero.

      Comment

      • Falcon Kirtaran

        #4
        Re: What could the compiler be possibly complaining about

        parag_paul@hotm ail.com wrote:
        Are there any compiler groups.
        Though I try it in this language forum
        I got the following message for the following line in a c file
        >
        if (logic_value_ch ange == p_variable_info->vc_reason &&
        p_variable_info->p_value->logic_value <4 &&
        p_variable_info->p_value->logic_value>=0 )
        >
        >
        >
        The message is
        ../star186559.c: In function `func_var':
        ../star186559.c:32 0: warning: comparison is always true due to limited
        range of data type
        >
        >
        >
        comparison is always true ????
        >
        The data type for logic_value is a unsigned char
        -Parag
        That warning sometimes comes up when you compare variables of different
        sizes. To really know what you need to do differently, I'd need the
        types of all the other variables you are comparing as well.

        To illustrate what is happening here, consider an unsigned char.
        Because it is only eight bytes long and can store values no larger than
        255, if you write something like:

        int function {
        char a = 255;
        if (a < 256) return 1;
        };

        The comparison will always be true and the function will always return 1.

        As a point of practice, it's always a good idea to put parentheses
        around the parts of a condition, eg:

        if ( (logic_value_ch ange == p_variable_info->vc_reason) &&
        (p_variable_inf o->p_value->logic_value < 4) &&
        (p_variable_inf o->p_value->logic_value >= 0) )

        However, conveniently, the precedence of ==, <, and >= are all greater
        than that of &&, so that shouldn't be your issue. -trumps all of
        those. I'm guessing that the issue is as simple as logic_value_cha nge
        and vc_reason having silly types.

        --
        --Falcon Kirtaran

        Comment

        • Falcon Kirtaran

          #5
          Re: What could the compiler be possibly complaining about

          Falcon Kirtaran wrote:
          parag_paul@hotm ail.com wrote:
          >Are there any compiler groups.
          >Though I try it in this language forum
          > I got the following message for the following line in a c file
          >>
          > if (logic_value_ch ange == p_variable_info->vc_reason &&
          > p_variable_info->p_value->logic_value <4 &&
          >p_variable_inf o->p_value->logic_value>=0 )
          >>
          >>
          >>
          >The message is
          >../star186559.c: In function `func_var':
          >../star186559.c:32 0: warning: comparison is always true due to limited
          >range of data type
          >>
          >>
          >>
          >comparison is always true ????
          >>
          >The data type for logic_value is a unsigned char
          >-Parag
          >
          That warning sometimes comes up when you compare variables of different
          sizes. To really know what you need to do differently, I'd need the
          types of all the other variables you are comparing as well.
          >
          To illustrate what is happening here, consider an unsigned char. Because
          it is only eight bytes long and can store values no larger than 255, if
          you write something like:
          >
          int function {
          char a = 255;
          if (a < 256) return 1;
          };
          >
          The comparison will always be true and the function will always return 1.
          >
          As a point of practice, it's always a good idea to put parentheses
          around the parts of a condition, eg:
          >
          if ( (logic_value_ch ange == p_variable_info->vc_reason) &&
          (p_variable_inf o->p_value->logic_value < 4) &&
          (p_variable_inf o->p_value->logic_value >= 0) )
          >
          However, conveniently, the precedence of ==, <, and >= are all greater
          than that of &&, so that shouldn't be your issue. -trumps all of
          those. I'm guessing that the issue is as simple as logic_value_cha nge
          and vc_reason having silly types.
          >
          --
          --Falcon Kirtaran
          Bah. Clearly, I am a fool. Your problem is "logic_value>=0 " because
          unsigned types can't contain negative numbers.

          Comment

          Working...