1 // Simple program that uses C99 restrict qualifier.
2 // Once GCC is fixed to output DW_TAG_restrict_type in the debuginfo
3 // valgrind --read-var-info=yes would get a serious error reading the
4 // debuginfo. This tests makes sure that a fixed GCC and a fixed valgrind
5 // work well together.
6 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59051
7 // https://bugs.kde.org/show_bug.cgi?id=336619
8 
9 #include <assert.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 
14 #include "memcheck/memcheck.h"
15 
16 /* Cause memcheck to complain about the address "a" and so to print
17    its best guess as to what "a" actually is.  a must be addressible. */
croak(void * aV)18 void croak (void *aV )
19 {
20   char* a = (char*)aV;
21   char* undefp = malloc(1);
22   char saved = *a;
23   assert(undefp);
24   *a = *undefp;
25   (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1);
26   *a = saved;
27   free(undefp);
28 }
29 
30 void
bad_restrict_ptr(void * restrict bad_ptr)31 bad_restrict_ptr (void * restrict bad_ptr)
32 {
33   croak ((void *) &bad_ptr);
34 }
35 
36 char *
cpy(char * restrict s1,const char * restrict s2,size_t n)37 cpy (char * restrict s1, const char * restrict s2, size_t n)
38 {
39   char *t1 = s1;
40   const char *t2 = s2;
41   while(n-- > 0)
42     *t1++ = *t2++;
43   return s1;
44 }
45 
46 int
main(int argc,char ** argv)47 main (int argc, char **argv)
48 {
49   const char *hello = "World";
50   size_t l = strlen (hello) + 1;
51   char *earth = malloc (l);
52   fprintf (stderr, "Hello %s\n", cpy (earth, hello, l));
53   free (earth);
54 
55   void *bad = malloc (16);
56   bad_restrict_ptr (bad);
57   free (bad);
58   return 0;
59 }
60