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)20dbf69b9dSrilligcompare_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)47dbf69b9dSrilligcompare_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)74d6ea25cdSrilligcompare_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)122d6ea25cdSrilligcompare_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