Home | History | Annotate | Download | only in tests
      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. */
     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
     31 bad_restrict_ptr (void * restrict bad_ptr)
     32 {
     33   croak ((void *) &bad_ptr);
     34 }
     35 
     36 char *
     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
     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