Home | History | Annotate | Line # | Download | only in lint1
msg_346.c revision 1.9.2.1
      1  1.9.2.1  perseant /*	$NetBSD: msg_346.c,v 1.9.2.1 2025/08/02 05:58:18 perseant Exp $	*/
      2      1.1    rillig # 3 "msg_346.c"
      3      1.1    rillig 
      4      1.1    rillig // Test for message: call to '%s' effectively discards 'const' from argument [346]
      5      1.1    rillig 
      6      1.8    rillig /* lint1-extra-flags: -X 351 */
      7      1.8    rillig 
      8      1.2    rillig typedef unsigned long size_t;
      9      1.2    rillig 
     10  1.9.2.1  perseant void *memchr(const void *, int, size_t);		/* C99 7.21.5.1 */
     11      1.2    rillig char *strchr(const char *, int);			/* C99 7.21.5.2 */
     12  1.9.2.1  perseant char *strpbrk(const char *, const char *);		/* C99 7.21.5.4 */
     13  1.9.2.1  perseant char *strrchr(const char *, int);			/* C99 7.21.5.5 */
     14  1.9.2.1  perseant char *strstr(const char *, const char *);		/* C99 7.21.5.7 */
     15      1.1    rillig 
     16      1.1    rillig void take_const_char_ptr(const char *);
     17      1.1    rillig void take_char_ptr(char *);
     18      1.1    rillig 
     19      1.1    rillig void
     20      1.1    rillig example(void)
     21      1.1    rillig {
     22      1.1    rillig 	const char *ccp = "const char *";
     23      1.1    rillig 	char *cp = "char *";
     24      1.1    rillig 
     25      1.1    rillig 	ccp = strchr(ccp, 'c');
     26      1.1    rillig 	ccp = strchr(cp, 'c');
     27      1.1    rillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
     28      1.1    rillig 	cp = strchr(ccp, 'c');
     29      1.1    rillig 	cp = strchr(cp, 'c');
     30      1.1    rillig 
     31      1.1    rillig 	take_const_char_ptr(strchr(ccp, 'c'));
     32      1.1    rillig 	take_const_char_ptr(strchr(cp, 'c'));
     33      1.1    rillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
     34      1.1    rillig 	take_char_ptr(strchr(ccp, 'c'));
     35      1.1    rillig 	take_char_ptr(strchr(cp, 'c'));
     36      1.1    rillig 
     37      1.1    rillig 	take_const_char_ptr(strchr("literal", 'c'));
     38      1.1    rillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
     39      1.1    rillig 	take_char_ptr(strchr("literal", 'c'));
     40      1.1    rillig }
     41      1.2    rillig 
     42      1.2    rillig void
     43      1.2    rillig all_functions(void)
     44      1.2    rillig {
     45      1.3    rillig 	/* expect+1: warning: call to 'memchr' effectively discards 'const' from argument [346] */
     46      1.2    rillig 	take_char_ptr(memchr("string", 'c', 7));
     47      1.2    rillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
     48      1.2    rillig 	take_char_ptr(strchr("string", 'c'));
     49      1.3    rillig 	/* expect+1: warning: call to 'strpbrk' effectively discards 'const' from argument [346] */
     50      1.2    rillig 	take_char_ptr(strpbrk("string", "c"));
     51      1.3    rillig 	/* expect+1: warning: call to 'strrchr' effectively discards 'const' from argument [346] */
     52      1.2    rillig 	take_char_ptr(strrchr("string", 'c'));
     53      1.3    rillig 	/* expect+1: warning: call to 'strstr' effectively discards 'const' from argument [346] */
     54      1.2    rillig 	take_char_ptr(strstr("string", "c"));
     55      1.2    rillig }
     56      1.4    rillig 
     57      1.4    rillig void
     58      1.4    rillig edge_cases(void)
     59      1.9    rillig {
     60      1.4    rillig 	/* No arguments, to cover the 'an == NULL' in is_first_arg_const. */
     61      1.9    rillig 	/* expect+1: error: argument mismatch: 0 arguments passed, 2 expected [150] */
     62      1.4    rillig 	take_char_ptr(strchr());
     63      1.4    rillig }
     64      1.5    rillig 
     65      1.5    rillig /*
     66      1.5    rillig  * Bsearch is another standard function that effectively discards the 'const'
     67      1.5    rillig  * modifier, but from the second argument, not the first.
     68      1.5    rillig  */
     69      1.5    rillig 
     70      1.5    rillig void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
     71      1.5    rillig 	int (*compar) (const void *, const void *));
     72      1.5    rillig 
     73      1.5    rillig int cmp(const void *, const void *);
     74      1.5    rillig 
     75      1.5    rillig void take_void_ptr(void *);
     76      1.6    rillig void take_const_void_ptr(const void *);
     77      1.5    rillig 
     78      1.5    rillig void
     79      1.5    rillig bsearch_example(void)
     80      1.5    rillig {
     81      1.6    rillig 	int arr[] = { 1 };
     82      1.5    rillig 	const int const_arr[] = { 1 };
     83      1.5    rillig 
     84      1.5    rillig 	take_const_void_ptr(bsearch("", const_arr, 4, 1, cmp));
     85      1.5    rillig 	take_const_void_ptr(bsearch("", arr, 4, 1, cmp));
     86      1.5    rillig 	take_void_ptr(bsearch("", arr, 4, 1, cmp));
     87      1.5    rillig 
     88      1.6    rillig 	/* expect+1: warning: call to 'bsearch' effectively discards 'const' from argument [346] */
     89      1.5    rillig 	take_void_ptr(bsearch("", const_arr, 4, 1, cmp));
     90      1.5    rillig }
     91