Home | History | Annotate | Line # | Download | only in lint1
msg_230_uchar.c revision 1.9
      1 /*	$NetBSD: msg_230_uchar.c,v 1.9 2022/06/22 19:23:18 rillig Exp $	*/
      2 # 3 "msg_230_uchar.c"
      3 
      4 // Test for message: nonportable character comparison '%s %d' [230]
      5 
      6 /* lint1-flags: -S -g -p -w */
      7 /* lint1-only-if: uchar */
      8 
      9 /*
     10  * C11 6.2.5p15 defines that 'char' has the same range, representation, and
     11  * behavior as either 'signed char' or 'unsigned char'.
     12  *
     13  * The portable range of 'char' is from 0 to 127 since all lint platforms
     14  * define CHAR_SIZE to be 8.
     15  *
     16  * See msg_162.c, which covers 'signed char' and 'unsigned char'.
     17  */
     18 
     19 void
     20 compare_plain_char(char c)
     21 {
     22 	/* expect+1: warning: nonportable character comparison '== -129' [230] */
     23 	if (c == -129)
     24 		return;
     25 	/* expect+1: warning: nonportable character comparison '== -128' [230] */
     26 	if (c == -128)
     27 		return;
     28 	/* expect+1: warning: nonportable character comparison '== -1' [230] */
     29 	if (c == -1)
     30 		return;
     31 	if (c == 0)
     32 		return;
     33 	if (c == 127)
     34 		return;
     35 	/* expect+1: warning: nonportable character comparison '== 128' [230] */
     36 	if (c == 128)
     37 		return;
     38 	/* expect+1: warning: nonportable character comparison '== 255' [230] */
     39 	if (c == 255)
     40 		return;
     41 	/* expect+1: warning: nonportable character comparison '== 256' [230] */
     42 	if (c == 256)
     43 		return;
     44 }
     45 
     46 void
     47 compare_plain_char_yoda(char c)
     48 {
     49 	/* expect+1: warning: nonportable character comparison '== -129' [230] */
     50 	if (-129 == c)
     51 		return;
     52 	/* expect+1: warning: nonportable character comparison '== -128' [230] */
     53 	if (-128 == c)
     54 		return;
     55 	/* expect+1: warning: nonportable character comparison '== -1' [230] */
     56 	if (-1 == c)
     57 		return;
     58 	if (0 == c)
     59 		return;
     60 	if (127 == c)
     61 		return;
     62 	/* expect+1: warning: nonportable character comparison '== 128' [230] */
     63 	if (128 == c)
     64 		return;
     65 	/* expect+1: warning: nonportable character comparison '== 255' [230] */
     66 	if (255 == c)
     67 		return;
     68 	/* expect+1: warning: nonportable character comparison '== 256' [230] */
     69 	if (256 == c)
     70 		return;
     71 }
     72 
     73 void
     74 compare_greater(char c)
     75 {
     76 
     77 	/* expect+1: warning: nonportable character comparison '> -2' [230] */
     78 	if (c > -2)
     79 		return;
     80 	/* expect+1: warning: nonportable character comparison '>= -1' [230] */
     81 	if (c >= -1)
     82 		return;
     83 
     84 	/*
     85 	 * XXX: The following two comparisons have the same effect, yet lint
     86 	 * only warns about one of them.
     87 	 */
     88 	/* expect+1: warning: nonportable character comparison '> -1' [230] */
     89 	if (c > -1)
     90 		return;
     91 	/*
     92 	 * This warning only occurs on uchar platforms since on these
     93 	 * platforms it is always true.  Code that needs this ordered
     94 	 * comparison on values of type plain char is questionable since it
     95 	 * behaves differently depending on the platform.  Such a comparison
     96 	 * should never be needed.
     97 	 */
     98 	/* expect+1: warning: operator '>=' compares 'char' with '0' [162] */
     99 	if (c >= 0)
    100 		return;
    101 
    102 	/*
    103 	 * XXX: The following two comparisons have the same effect, yet lint
    104 	 * only warns about one of them.
    105 	 */
    106 	if (c > 127)
    107 		return;
    108 	/* expect+1: warning: nonportable character comparison '>= 128' [230] */
    109 	if (c >= 128)
    110 		return;
    111 
    112 	/* expect+1: warning: nonportable character comparison '> 128' [230] */
    113 	if (c > 128)
    114 		return;
    115 	/* expect+1: warning: nonportable character comparison '>= 129' [230] */
    116 	if (c >= 129)
    117 		return;
    118 }
    119 
    120 void
    121 compare_with_character_literal(char ch)
    122 {
    123 	/*
    124 	 * These comparisons are portable since the character constant is
    125 	 * interpreted using the type 'char' on the exact same platform as
    126 	 * where the comparison takes place.
    127 	 */
    128 	/* expect+1: warning: nonportable character comparison '== 128' [230] */
    129 	if (ch == '\200')
    130 		return;
    131 	/* expect+1: warning: nonportable character comparison '== 255' [230] */
    132 	if (ch == '\377')
    133 		return;
    134 	if (ch == '\000')
    135 		return;
    136 }
    137