1*b2baa501Srillig /* $NetBSD: msg_342.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
2c83f7defSrillig # 3 "msg_342.c"
3b5bd70afSrillig
4b5bd70afSrillig // Test for message: argument to '%s' must be cast to 'unsigned char', not to '%s' [342]
5b5bd70afSrillig
6b5bd70afSrillig /*
7b5bd70afSrillig * Ensure that the functions from <ctype.h> are called with the correct
8b5bd70afSrillig * argument.
9b5bd70afSrillig */
10b5bd70afSrillig
11*b2baa501Srillig /* lint1-extra-flags: -X 351 */
12*b2baa501Srillig
13b5bd70afSrillig /* NetBSD 9.99.81, <ctype.h> */
14b5bd70afSrillig extern const unsigned short *_ctype_tab_;
15b5bd70afSrillig extern const short *_tolower_tab_;
16b5bd70afSrillig extern const short *_toupper_tab_;
177ed694cbSrillig int isalnum(int);
187ed694cbSrillig int isalpha(int);
197ed694cbSrillig int isblank(int);
207ed694cbSrillig int iscntrl(int);
217ed694cbSrillig int isdigit(int);
227ed694cbSrillig int isgraph(int);
237ed694cbSrillig int islower(int);
247ed694cbSrillig int isprint(int);
257ed694cbSrillig int ispunct(int);
26b5bd70afSrillig int isspace(int);
277ed694cbSrillig int isupper(int);
287ed694cbSrillig int isxdigit(int);
297ed694cbSrillig int tolower(int);
307ed694cbSrillig int toupper(int);
31b5bd70afSrillig
3252d06849Srillig int is_other(int);
3352d06849Srillig int to_other(int);
3452d06849Srillig
35b5bd70afSrillig void sink(int);
36b5bd70afSrillig
37b5bd70afSrillig void
cover_is_ctype_function(char c)387ed694cbSrillig cover_is_ctype_function(char c)
397ed694cbSrillig {
407ed694cbSrillig /* expect+1: warning: argument to 'isalnum' must be 'unsigned char' or EOF, not 'char' [341] */
417ed694cbSrillig isalnum(c);
427ed694cbSrillig /* expect+1: warning: argument to 'isalpha' must be 'unsigned char' or EOF, not 'char' [341] */
437ed694cbSrillig isalpha(c);
447ed694cbSrillig /* expect+1: warning: argument to 'isblank' must be 'unsigned char' or EOF, not 'char' [341] */
457ed694cbSrillig isblank(c);
467ed694cbSrillig /* expect+1: warning: argument to 'iscntrl' must be 'unsigned char' or EOF, not 'char' [341] */
477ed694cbSrillig iscntrl(c);
487ed694cbSrillig /* expect+1: warning: argument to 'isdigit' must be 'unsigned char' or EOF, not 'char' [341] */
497ed694cbSrillig isdigit(c);
507ed694cbSrillig /* expect+1: warning: argument to 'isgraph' must be 'unsigned char' or EOF, not 'char' [341] */
517ed694cbSrillig isgraph(c);
527ed694cbSrillig /* expect+1: warning: argument to 'islower' must be 'unsigned char' or EOF, not 'char' [341] */
537ed694cbSrillig islower(c);
547ed694cbSrillig /* expect+1: warning: argument to 'isprint' must be 'unsigned char' or EOF, not 'char' [341] */
557ed694cbSrillig isprint(c);
567ed694cbSrillig /* expect+1: warning: argument to 'ispunct' must be 'unsigned char' or EOF, not 'char' [341] */
577ed694cbSrillig ispunct(c);
587ed694cbSrillig /* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
597ed694cbSrillig isspace(c);
607ed694cbSrillig /* expect+1: warning: argument to 'isupper' must be 'unsigned char' or EOF, not 'char' [341] */
617ed694cbSrillig isupper(c);
627ed694cbSrillig /* expect+1: warning: argument to 'isxdigit' must be 'unsigned char' or EOF, not 'char' [341] */
637ed694cbSrillig isxdigit(c);
647ed694cbSrillig /* expect+1: warning: argument to 'tolower' must be 'unsigned char' or EOF, not 'char' [341] */
657ed694cbSrillig tolower(c);
667ed694cbSrillig /* expect+1: warning: argument to 'toupper' must be 'unsigned char' or EOF, not 'char' [341] */
677ed694cbSrillig toupper(c);
6852d06849Srillig
6952d06849Srillig /* Functions with similar names are not checked. */
7052d06849Srillig is_other(c);
7152d06849Srillig to_other(c);
727ed694cbSrillig }
737ed694cbSrillig
747ed694cbSrillig void
function_call_char(char c)75b5bd70afSrillig function_call_char(char c)
76b5bd70afSrillig {
77b5bd70afSrillig
78c83f7defSrillig /* expect+1: warning: argument to 'isspace' must be 'unsigned char' or EOF, not 'char' [341] */
79b5bd70afSrillig (isspace)(c);
80b5bd70afSrillig
81b5bd70afSrillig /* This is the only allowed form. */
82b5bd70afSrillig isspace((unsigned char)c);
83b5bd70afSrillig
84b5bd70afSrillig /* The cast to 'int' is redundant, it doesn't hurt though. */
85b5bd70afSrillig isspace((int)(unsigned char)c);
86b5bd70afSrillig
87c83f7defSrillig /* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'int' [342] */
88b5bd70afSrillig isspace((int)c);
89b5bd70afSrillig
90c83f7defSrillig /* expect+1: warning: argument to 'isspace' must be cast to 'unsigned char', not to 'unsigned int' [342] */
91b5bd70afSrillig isspace((unsigned int)c);
92b5bd70afSrillig }
93b5bd70afSrillig
94b5bd70afSrillig /*
95b5bd70afSrillig * If the expression starts with type 'unsigned char', it can be cast to any
96b5bd70afSrillig * other type. Chances are low enough that the cast is to 'char', which would
97b5bd70afSrillig * be the only bad type.
98b5bd70afSrillig */
99b5bd70afSrillig void
function_call_unsigned_char(unsigned char c)100b5bd70afSrillig function_call_unsigned_char(unsigned char c)
101b5bd70afSrillig {
102b5bd70afSrillig
103b5bd70afSrillig (isspace)(c);
104b5bd70afSrillig isspace((unsigned char)c);
105b5bd70afSrillig isspace((int)c);
106b5bd70afSrillig isspace((unsigned int)c);
107b5bd70afSrillig }
108b5bd70afSrillig
109b5bd70afSrillig /* When used in a loop of fgetc, the type is already 'int'. That's fine. */
110b5bd70afSrillig void
function_call_int(int c)111b5bd70afSrillig function_call_int(int c)
112b5bd70afSrillig {
113b5bd70afSrillig
114b5bd70afSrillig isspace(c);
115b5bd70afSrillig }
116b5bd70afSrillig
117b5bd70afSrillig void
macro_invocation_NetBSD(char c)118b5bd70afSrillig macro_invocation_NetBSD(char c)
119b5bd70afSrillig {
120b5bd70afSrillig
121c83f7defSrillig /* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' [341] */
122b5bd70afSrillig sink(((int)((_ctype_tab_ + 1)[(c)] & 0x0040)));
123b5bd70afSrillig
124b5bd70afSrillig /* This is the only allowed form. */
125b5bd70afSrillig sink(((int)((_ctype_tab_ + 1)[((unsigned char)c)] & 0x0040)));
126b5bd70afSrillig
127c83f7defSrillig /* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'int' [342] */
128b5bd70afSrillig sink(((int)((_ctype_tab_ + 1)[((int)c)] & 0x0040)));
129b5bd70afSrillig
130c83f7defSrillig /* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' [342] */
131b5bd70afSrillig sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
132b5bd70afSrillig }
133