Home | History | Annotate | Line # | Download | only in lint1
msg_162.c revision 1.8
      1 /*	$NetBSD: msg_162.c,v 1.8 2023/03/28 14:44:35 rillig Exp $	*/
      2 # 3 "msg_162.c"
      3 
      4 // Test for message: operator '%s' compares '%s' with '%s' [162]
      5 
      6 /* lint1-extra-flags: -hp -X 351 */
      7 
      8 void
      9 left_unsigned(unsigned int ui)
     10 {
     11 	if (ui < -5.0) {
     12 	}
     13 
     14 	/* expect+1: warning: operator '<' compares 'unsigned int' with 'negative constant' [162] */
     15 	if (ui < -5) {
     16 	}
     17 
     18 	/* expect+1: warning: operator '<' compares 'unsigned int' with '0' [162] */
     19 	if (ui < 0) {
     20 	}
     21 
     22 	/* expect+1: warning: operator '>=' compares 'unsigned int' with '0' [162] */
     23 	if (ui >= 0) {
     24 	}
     25 
     26 	/* before 2021-09-05: comparison of unsigned int with 0, op <= [162] */
     27 	if (ui <= 0) {
     28 	}
     29 }
     30 
     31 void
     32 right_unsigned(unsigned int ui)
     33 {
     34 
     35 	if (-5.0 > ui) {
     36 	}
     37 
     38 	/* expect+1: warning: operator '>' compares 'negative constant' with 'unsigned int' [162] */
     39 	if (-5 > ui) {
     40 	}
     41 
     42 	/* expect+1: warning: operator '>' compares '0' with 'unsigned int' [162] */
     43 	if (0 > ui) {
     44 	}
     45 
     46 	/* expect+1: warning: operator '<=' compares '0' with 'unsigned int' [162] */
     47 	if (0 <= ui) {
     48 	}
     49 
     50 	/* before 2021-09-05: comparison of 0 with unsigned int, op >= [162] */
     51 	if (0 >= ui) {
     52 	}
     53 }
     54 
     55 /*
     56  * Lint does not care about these comparisons, even though they are obviously
     57  * out of range.
     58  */
     59 void
     60 compare_signed_char(signed char sc)
     61 {
     62 	if (sc == -129)
     63 		return;
     64 	if (sc == -128)
     65 		return;
     66 	if (sc == 127)
     67 		return;
     68 	if (sc == 128)
     69 		return;
     70 }
     71 
     72 void
     73 compare_unsigned_char(unsigned char uc)
     74 {
     75 	/* expect+1: warning: operator '==' compares 'unsigned char' with 'negative constant' [162] */
     76 	if (uc == -1)
     77 		return;
     78 	if (uc == 0)
     79 		return;
     80 	if (uc == 255)
     81 		return;
     82 	if (uc == 256)
     83 		return;
     84 }
     85 
     86 void take_bool(_Bool);
     87 
     88 void
     89 compare_operators(unsigned int x)
     90 {
     91 	/* expect+1: warning: operator '<' compares 'unsigned int' with 'negative constant' [162] */
     92 	take_bool(x < -1);
     93 	/* expect+1: warning: operator '<' compares 'unsigned int' with '0' [162] */
     94 	take_bool(x < 0);
     95 	take_bool(x < 1);
     96 
     97 	/* expect+1: warning: operator '<=' compares 'unsigned int' with 'negative constant' [162] */
     98 	take_bool(x <= -1);
     99 	/*
    100 	 * Before tree.c 1.379 from 2021-09-05, lint warned about
    101 	 * 'unsigned <= 0' as well as '0 >= unsigned'.  In all cases where
    102 	 * the programmer knows whether the underlying data type is signed or
    103 	 * unsigned, it is clearer to express the same thought as
    104 	 * 'unsigned == 0', but that's a stylistic issue only.
    105 	 *
    106 	 * Removing this particular case of the warning is not expected to
    107 	 * miss any bugs.  The expression 'x <= 0' is equivalent to 'x < 1',
    108 	 * so lint should not warn about it, just as it doesn't warn about
    109 	 * the inverted condition, which is 'x > 0'.
    110 	 */
    111 	/* before 2021-09-05: comparison of unsigned int with 0, op <= [162] */
    112 	take_bool(x <= 0);
    113 	take_bool(x <= 1);
    114 
    115 	/* expect+1: warning: operator '>' compares 'unsigned int' with 'negative constant' [162] */
    116 	take_bool(x > -1);
    117 	take_bool(x > 0);
    118 	take_bool(x > 1);
    119 
    120 	/* expect+1: warning: operator '>=' compares 'unsigned int' with 'negative constant' [162] */
    121 	take_bool(x >= -1);
    122 	/* expect+1: warning: operator '>=' compares 'unsigned int' with '0' [162] */
    123 	take_bool(x >= 0);
    124 	take_bool(x >= 1);
    125 
    126 	/* expect+1: warning: operator '==' compares 'unsigned int' with 'negative constant' [162] */
    127 	take_bool(x == -1);
    128 	take_bool(x == 0);
    129 	take_bool(x == 1);
    130 
    131 	/* expect+1: warning: operator '!=' compares 'unsigned int' with 'negative constant' [162] */
    132 	take_bool(x != -1);
    133 	take_bool(x != 0);
    134 	take_bool(x != 1);
    135 }
    136