xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_230_uchar.c (revision 1d1794a80f5e3b9141458440f4c1a3176d8385e7)
1*1d1794a8Srillig /*	$NetBSD: msg_230_uchar.c,v 1.13 2023/07/08 11:03:00 rillig Exp $	*/
25088bff9Srillig # 3 "msg_230_uchar.c"
35088bff9Srillig 
46adfeb94Srillig // Test for message: nonportable character comparison '%s' [230]
55088bff9Srillig 
6*1d1794a8Srillig /* lint1-flags: -S -g -p -w -X 351 */
7dadd5dc3Srillig /* lint1-only-if: uchar */
85088bff9Srillig 
9dbf69b9dSrillig /*
10dbf69b9dSrillig  * C11 6.2.5p15 defines that 'char' has the same range, representation, and
11dbf69b9dSrillig  * behavior as either 'signed char' or 'unsigned char'.
12dbf69b9dSrillig  *
13dbf69b9dSrillig  * The portable range of 'char' is from 0 to 127 since all lint platforms
14dbf69b9dSrillig  * define CHAR_SIZE to be 8.
15dbf69b9dSrillig  *
16dbf69b9dSrillig  * See msg_162.c, which covers 'signed char' and 'unsigned char'.
17dbf69b9dSrillig  */
18dbf69b9dSrillig 
19dbf69b9dSrillig void
compare_plain_char(char c)20dbf69b9dSrillig compare_plain_char(char c)
215088bff9Srillig {
2238da6713Srillig 	/* expect+1: warning: nonportable character comparison '== -129' [230] */
23dbf69b9dSrillig 	if (c == -129)
245088bff9Srillig 		return;
2538da6713Srillig 	/* expect+1: warning: nonportable character comparison '== -128' [230] */
26dbf69b9dSrillig 	if (c == -128)
275088bff9Srillig 		return;
2838da6713Srillig 	/* expect+1: warning: nonportable character comparison '== -1' [230] */
29dbf69b9dSrillig 	if (c == -1)
30dbf69b9dSrillig 		return;
31dbf69b9dSrillig 	if (c == 0)
32dbf69b9dSrillig 		return;
33dbf69b9dSrillig 	if (c == 127)
34dbf69b9dSrillig 		return;
3538da6713Srillig 	/* expect+1: warning: nonportable character comparison '== 128' [230] */
36dbf69b9dSrillig 	if (c == 128)
37dbf69b9dSrillig 		return;
3838da6713Srillig 	/* expect+1: warning: nonportable character comparison '== 255' [230] */
39dbf69b9dSrillig 	if (c == 255)
40dbf69b9dSrillig 		return;
4138da6713Srillig 	/* expect+1: warning: nonportable character comparison '== 256' [230] */
42dbf69b9dSrillig 	if (c == 256)
43dbf69b9dSrillig 		return;
44dbf69b9dSrillig }
45dbf69b9dSrillig 
46dbf69b9dSrillig void
compare_plain_char_yoda(char c)47dbf69b9dSrillig compare_plain_char_yoda(char c)
48dbf69b9dSrillig {
4917f65f1eSrillig 	/* expect+1: warning: nonportable character comparison '-129 == ?' [230] */
50dbf69b9dSrillig 	if (-129 == c)
51dbf69b9dSrillig 		return;
5217f65f1eSrillig 	/* expect+1: warning: nonportable character comparison '-128 == ?' [230] */
53dbf69b9dSrillig 	if (-128 == c)
54dbf69b9dSrillig 		return;
5517f65f1eSrillig 	/* expect+1: warning: nonportable character comparison '-1 == ?' [230] */
56dbf69b9dSrillig 	if (-1 == c)
57dbf69b9dSrillig 		return;
58dbf69b9dSrillig 	if (0 == c)
59dbf69b9dSrillig 		return;
60dbf69b9dSrillig 	if (127 == c)
61dbf69b9dSrillig 		return;
6217f65f1eSrillig 	/* expect+1: warning: nonportable character comparison '128 == ?' [230] */
63dbf69b9dSrillig 	if (128 == c)
64dbf69b9dSrillig 		return;
6517f65f1eSrillig 	/* expect+1: warning: nonportable character comparison '255 == ?' [230] */
66dbf69b9dSrillig 	if (255 == c)
67dbf69b9dSrillig 		return;
6817f65f1eSrillig 	/* expect+1: warning: nonportable character comparison '256 == ?' [230] */
69dbf69b9dSrillig 	if (256 == c)
70dbf69b9dSrillig 		return;
71dbf69b9dSrillig }
72dbf69b9dSrillig 
73dbf69b9dSrillig void
compare_greater(char c)74d6ea25cdSrillig compare_greater(char c)
75dbf69b9dSrillig {
76dbf69b9dSrillig 
7738da6713Srillig 	/* expect+1: warning: nonportable character comparison '> -2' [230] */
78dbf69b9dSrillig 	if (c > -2)
79dbf69b9dSrillig 		return;
8038da6713Srillig 	/* expect+1: warning: nonportable character comparison '>= -1' [230] */
81dbf69b9dSrillig 	if (c >= -1)
825088bff9Srillig 		return;
835088bff9Srillig 
845088bff9Srillig 	/*
85dbf69b9dSrillig 	 * XXX: The following two comparisons have the same effect, yet lint
86dbf69b9dSrillig 	 * only warns about one of them.
870d1a27f6Srillig 	 */
8838da6713Srillig 	/* expect+1: warning: nonportable character comparison '> -1' [230] */
89dbf69b9dSrillig 	if (c > -1)
905088bff9Srillig 		return;
91dbf69b9dSrillig 	/*
92dbf69b9dSrillig 	 * This warning only occurs on uchar platforms since on these
93dbf69b9dSrillig 	 * platforms it is always true.  Code that needs this ordered
94dbf69b9dSrillig 	 * comparison on values of type plain char is questionable since it
95dbf69b9dSrillig 	 * behaves differently depending on the platform.  Such a comparison
96dbf69b9dSrillig 	 * should never be needed.
97dbf69b9dSrillig 	 */
9840a9b8fdSrillig 	/* expect+1: warning: operator '>=' compares 'char' with '0' [162] */
99dbf69b9dSrillig 	if (c >= 0)
1005088bff9Srillig 		return;
101dbf69b9dSrillig 
102dbf69b9dSrillig 	/*
103dbf69b9dSrillig 	 * XXX: The following two comparisons have the same effect, yet lint
104dbf69b9dSrillig 	 * only warns about one of them.
105dbf69b9dSrillig 	 */
106dbf69b9dSrillig 	if (c > 127)
107dbf69b9dSrillig 		return;
10838da6713Srillig 	/* expect+1: warning: nonportable character comparison '>= 128' [230] */
109dbf69b9dSrillig 	if (c >= 128)
110dbf69b9dSrillig 		return;
111dbf69b9dSrillig 
11238da6713Srillig 	/* expect+1: warning: nonportable character comparison '> 128' [230] */
113dbf69b9dSrillig 	if (c > 128)
114dbf69b9dSrillig 		return;
11538da6713Srillig 	/* expect+1: warning: nonportable character comparison '>= 129' [230] */
116dbf69b9dSrillig 	if (c >= 129)
1175088bff9Srillig 		return;
1185088bff9Srillig }
119d6ea25cdSrillig 
1206ef27db9Srillig /* Comparing a char expression with a character constant is always valid. */
121d6ea25cdSrillig void
compare_with_character_literal(char ch)122d6ea25cdSrillig compare_with_character_literal(char ch)
123d6ea25cdSrillig {
124d6ea25cdSrillig 	if (ch == '\200')
125d6ea25cdSrillig 		return;
126d6ea25cdSrillig 	if (ch == '\377')
127d6ea25cdSrillig 		return;
128d6ea25cdSrillig 	if (ch == '\000')
129d6ea25cdSrillig 		return;
130d6ea25cdSrillig }
131