Home | History | Annotate | Line # | Download | only in lint1
msg_346.c revision 1.10
      1  1.10  rillig /*	$NetBSD: msg_346.c,v 1.10 2024/08/31 06:57:31 rillig 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.10  rillig 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.10  rillig char *strpbrk(const char *, const char *);		/* C99 7.21.5.4 */
     13  1.10  rillig char *strrchr(const char *, int);			/* C99 7.21.5.5 */
     14  1.10  rillig 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