xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_230.c (revision e6298b924c5ba98f3a22919b56dab04a87cdbb1c)
1*e6298b92Srillig /*	$NetBSD: msg_230.c,v 1.14 2023/07/07 19:45:22 rillig Exp $	*/
2a0a15c14Srillig # 3 "msg_230.c"
3a0a15c14Srillig 
46adfeb94Srillig // Test for message: nonportable character comparison '%s' [230]
5a0a15c14Srillig 
6*e6298b92Srillig /* lint1-flags: -S -g -p -w -X 351 */
7dadd5dc3Srillig /* lint1-only-if: schar */
88a6c8bc4Srillig 
90d1a27f6Srillig /*
100d1a27f6Srillig  * C11 6.2.5p15 defines that 'char' has the same range, representation, and
110d1a27f6Srillig  * behavior as either 'signed char' or 'unsigned char'.
120d1a27f6Srillig  *
130d1a27f6Srillig  * The portable range of 'char' is from 0 to 127 since all lint platforms
140d1a27f6Srillig  * define CHAR_SIZE to be 8.
150d1a27f6Srillig  *
160d1a27f6Srillig  * See msg_162.c, which covers 'signed char' and 'unsigned char'.
170d1a27f6Srillig  */
180d1a27f6Srillig 
190d1a27f6Srillig void
compare_plain_char(char c)200d1a27f6Srillig compare_plain_char(char c)
218a6c8bc4Srillig {
2204a944b0Srillig 	/* expect+1: warning: nonportable character comparison '== -129' [230] */
230d1a27f6Srillig 	if (c == -129)
245088bff9Srillig 		return;
2504a944b0Srillig 	/* expect+1: warning: nonportable character comparison '== -128' [230] */
260d1a27f6Srillig 	if (c == -128)
275088bff9Srillig 		return;
2804a944b0Srillig 	/* expect+1: warning: nonportable character comparison '== -1' [230] */
290d1a27f6Srillig 	if (c == -1)
300d1a27f6Srillig 		return;
310d1a27f6Srillig 	if (c == 0)
320d1a27f6Srillig 		return;
330d1a27f6Srillig 	if (c == 127)
340d1a27f6Srillig 		return;
3504a944b0Srillig 	/* expect+1: warning: nonportable character comparison '== 128' [230] */
360d1a27f6Srillig 	if (c == 128)
370d1a27f6Srillig 		return;
3804a944b0Srillig 	/* expect+1: warning: nonportable character comparison '== 255' [230] */
390d1a27f6Srillig 	if (c == 255)
400d1a27f6Srillig 		return;
4104a944b0Srillig 	/* expect+1: warning: nonportable character comparison '== 256' [230] */
420d1a27f6Srillig 	if (c == 256)
430d1a27f6Srillig 		return;
440d1a27f6Srillig }
450d1a27f6Srillig 
460d1a27f6Srillig void
compare_plain_char_yoda(char c)470d1a27f6Srillig compare_plain_char_yoda(char c)
480d1a27f6Srillig {
496adfeb94Srillig 	/* expect+1: warning: nonportable character comparison '-129 == ?' [230] */
500d1a27f6Srillig 	if (-129 == c)
510d1a27f6Srillig 		return;
526adfeb94Srillig 	/* expect+1: warning: nonportable character comparison '-128 == ?' [230] */
530d1a27f6Srillig 	if (-128 == c)
540d1a27f6Srillig 		return;
556adfeb94Srillig 	/* expect+1: warning: nonportable character comparison '-1 == ?' [230] */
560d1a27f6Srillig 	if (-1 == c)
570d1a27f6Srillig 		return;
580d1a27f6Srillig 	if (0 == c)
590d1a27f6Srillig 		return;
600d1a27f6Srillig 	if (127 == c)
610d1a27f6Srillig 		return;
626adfeb94Srillig 	/* expect+1: warning: nonportable character comparison '128 == ?' [230] */
630d1a27f6Srillig 	if (128 == c)
640d1a27f6Srillig 		return;
656adfeb94Srillig 	/* expect+1: warning: nonportable character comparison '255 == ?' [230] */
660d1a27f6Srillig 	if (255 == c)
670d1a27f6Srillig 		return;
686adfeb94Srillig 	/* expect+1: warning: nonportable character comparison '256 == ?' [230] */
690d1a27f6Srillig 	if (256 == c)
700d1a27f6Srillig 		return;
710d1a27f6Srillig }
720d1a27f6Srillig 
730d1a27f6Srillig void
compare_greater(char c)74d6ea25cdSrillig compare_greater(char c)
750d1a27f6Srillig {
760d1a27f6Srillig 
7704a944b0Srillig 	/* expect+1: warning: nonportable character comparison '> -2' [230] */
780d1a27f6Srillig 	if (c > -2)
790d1a27f6Srillig 		return;
8004a944b0Srillig 	/* expect+1: warning: nonportable character comparison '>= -1' [230] */
810d1a27f6Srillig 	if (c >= -1)
828a6c8bc4Srillig 		return;
838a6c8bc4Srillig 
848a6c8bc4Srillig 	/*
850d1a27f6Srillig 	 * XXX: The following two comparisons have the same effect, yet lint
860d1a27f6Srillig 	 * only warns about one of them.
875088bff9Srillig 	 */
8804a944b0Srillig 	/* expect+1: warning: nonportable character comparison '> -1' [230] */
890d1a27f6Srillig 	if (c > -1)
905088bff9Srillig 		return;
91dbf69b9dSrillig 	/*
92dbf69b9dSrillig 	 * On platforms where char is unsigned, lint warns that the
93dbf69b9dSrillig 	 * comparison always evaluates to true; see msg_230_uchar.c.
94dbf69b9dSrillig 	 */
950d1a27f6Srillig 	if (c >= 0)
968a6c8bc4Srillig 		return;
970b138779Srillig 
980d1a27f6Srillig 	/*
990d1a27f6Srillig 	 * XXX: The following two comparisons have the same effect, yet lint
1000d1a27f6Srillig 	 * only warns about one of them.
1010d1a27f6Srillig 	 */
1020d1a27f6Srillig 	if (c > 127)
1030b138779Srillig 		return;
10404a944b0Srillig 	/* expect+1: warning: nonportable character comparison '>= 128' [230] */
1050d1a27f6Srillig 	if (c >= 128)
1060d1a27f6Srillig 		return;
1070d1a27f6Srillig 
10804a944b0Srillig 	/* expect+1: warning: nonportable character comparison '> 128' [230] */
1090d1a27f6Srillig 	if (c > 128)
1100d1a27f6Srillig 		return;
11104a944b0Srillig 	/* expect+1: warning: nonportable character comparison '>= 129' [230] */
1120d1a27f6Srillig 	if (c >= 129)
1130b138779Srillig 		return;
1148a6c8bc4Srillig }
115b9cd838eSrillig 
1166ef27db9Srillig /* Comparing a char expression with a character constant is always valid. */
117b9cd838eSrillig void
compare_with_character_literal(char ch)118b9cd838eSrillig compare_with_character_literal(char ch)
119b9cd838eSrillig {
120b9cd838eSrillig 	if (ch == '\200')
121b9cd838eSrillig 		return;
122b9cd838eSrillig 	if (ch == '\377')
123b9cd838eSrillig 		return;
124b9cd838eSrillig 	if (ch == '\000')
125b9cd838eSrillig 		return;
126b9cd838eSrillig }
127