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)200d1a27f6Srilligcompare_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)470d1a27f6Srilligcompare_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)74d6ea25cdSrilligcompare_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)118b9cd838eSrilligcompare_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