xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_346.c (revision 465ab238788e2dd3555edb0497148fa4c5f47dc7)
1*465ab238Srillig /*	$NetBSD: msg_346.c,v 1.10 2024/08/31 06:57:31 rillig Exp $	*/
29cea3ffaSrillig # 3 "msg_346.c"
39cea3ffaSrillig 
49cea3ffaSrillig // Test for message: call to '%s' effectively discards 'const' from argument [346]
59cea3ffaSrillig 
6b2baa501Srillig /* lint1-extra-flags: -X 351 */
7b2baa501Srillig 
802254ebbSrillig typedef unsigned long size_t;
902254ebbSrillig 
1002254ebbSrillig void *memchr(const void *, int, size_t);		/* C99 7.21.5.1 */
1102254ebbSrillig char *strchr(const char *, int);			/* C99 7.21.5.2 */
1202254ebbSrillig char *strpbrk(const char *, const char *);		/* C99 7.21.5.4 */
1302254ebbSrillig char *strrchr(const char *, int);			/* C99 7.21.5.5 */
1402254ebbSrillig char *strstr(const char *, const char *);		/* C99 7.21.5.7 */
159cea3ffaSrillig 
169cea3ffaSrillig void take_const_char_ptr(const char *);
179cea3ffaSrillig void take_char_ptr(char *);
189cea3ffaSrillig 
199cea3ffaSrillig void
209cea3ffaSrillig example(void)
219cea3ffaSrillig {
229cea3ffaSrillig 	const char *ccp = "const char *";
239cea3ffaSrillig 	char *cp = "char *";
249cea3ffaSrillig 
259cea3ffaSrillig 	ccp = strchr(ccp, 'c');
269cea3ffaSrillig 	ccp = strchr(cp, 'c');
279cea3ffaSrillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
289cea3ffaSrillig 	cp = strchr(ccp, 'c');
299cea3ffaSrillig 	cp = strchr(cp, 'c');
309cea3ffaSrillig 
319cea3ffaSrillig 	take_const_char_ptr(strchr(ccp, 'c'));
329cea3ffaSrillig 	take_const_char_ptr(strchr(cp, 'c'));
339cea3ffaSrillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
349cea3ffaSrillig 	take_char_ptr(strchr(ccp, 'c'));
359cea3ffaSrillig 	take_char_ptr(strchr(cp, 'c'));
369cea3ffaSrillig 
379cea3ffaSrillig 	take_const_char_ptr(strchr("literal", 'c'));
389cea3ffaSrillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
399cea3ffaSrillig 	take_char_ptr(strchr("literal", 'c'));
409cea3ffaSrillig }
4102254ebbSrillig 
4202254ebbSrillig void
4302254ebbSrillig all_functions(void)
4402254ebbSrillig {
4534e56d2dSrillig 	/* expect+1: warning: call to 'memchr' effectively discards 'const' from argument [346] */
4602254ebbSrillig 	take_char_ptr(memchr("string", 'c', 7));
4702254ebbSrillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
4802254ebbSrillig 	take_char_ptr(strchr("string", 'c'));
4934e56d2dSrillig 	/* expect+1: warning: call to 'strpbrk' effectively discards 'const' from argument [346] */
5002254ebbSrillig 	take_char_ptr(strpbrk("string", "c"));
5134e56d2dSrillig 	/* expect+1: warning: call to 'strrchr' effectively discards 'const' from argument [346] */
5202254ebbSrillig 	take_char_ptr(strrchr("string", 'c'));
5334e56d2dSrillig 	/* expect+1: warning: call to 'strstr' effectively discards 'const' from argument [346] */
5402254ebbSrillig 	take_char_ptr(strstr("string", "c"));
5502254ebbSrillig }
561678a18aSrillig 
571678a18aSrillig void
581678a18aSrillig edge_cases(void)
59f2bab287Srillig {
601678a18aSrillig 	/* No arguments, to cover the 'an == NULL' in is_first_arg_const. */
61f2bab287Srillig 	/* expect+1: error: argument mismatch: 0 arguments passed, 2 expected [150] */
621678a18aSrillig 	take_char_ptr(strchr());
631678a18aSrillig }
640ad85c20Srillig 
650ad85c20Srillig /*
660ad85c20Srillig  * Bsearch is another standard function that effectively discards the 'const'
670ad85c20Srillig  * modifier, but from the second argument, not the first.
680ad85c20Srillig  */
690ad85c20Srillig 
700ad85c20Srillig void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
710ad85c20Srillig 	int (*compar) (const void *, const void *));
720ad85c20Srillig 
730ad85c20Srillig int cmp(const void *, const void *);
740ad85c20Srillig 
750ad85c20Srillig void take_void_ptr(void *);
76c43e4b83Srillig void take_const_void_ptr(const void *);
770ad85c20Srillig 
780ad85c20Srillig void
790ad85c20Srillig bsearch_example(void)
800ad85c20Srillig {
81c43e4b83Srillig 	int arr[] = { 1 };
820ad85c20Srillig 	const int const_arr[] = { 1 };
830ad85c20Srillig 
840ad85c20Srillig 	take_const_void_ptr(bsearch("", const_arr, 4, 1, cmp));
850ad85c20Srillig 	take_const_void_ptr(bsearch("", arr, 4, 1, cmp));
860ad85c20Srillig 	take_void_ptr(bsearch("", arr, 4, 1, cmp));
870ad85c20Srillig 
88c43e4b83Srillig 	/* expect+1: warning: call to 'bsearch' effectively discards 'const' from argument [346] */
890ad85c20Srillig 	take_void_ptr(bsearch("", const_arr, 4, 1, cmp));
900ad85c20Srillig }
91