| // Simple program that uses C99 restrict qualifier. |
| // Once GCC is fixed to output DW_TAG_restrict_type in the debuginfo |
| // valgrind --read-var-info=yes would get a serious error reading the |
| // debuginfo. This tests makes sure that a fixed GCC and a fixed valgrind |
| // work well together. |
| // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59051 |
| // https://bugs.kde.org/show_bug.cgi?id=336619 |
| |
| #include <assert.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include "memcheck/memcheck.h" |
| |
| /* Cause memcheck to complain about the address "a" and so to print |
| its best guess as to what "a" actually is. a must be addressible. */ |
| void croak (void *aV ) |
| { |
| char* a = (char*)aV; |
| char* undefp = malloc(1); |
| char saved = *a; |
| assert(undefp); |
| *a = *undefp; |
| (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1); |
| *a = saved; |
| free(undefp); |
| } |
| |
| void |
| bad_restrict_ptr (void * restrict bad_ptr) |
| { |
| croak ((void *) &bad_ptr); |
| } |
| |
| char * |
| cpy (char * restrict s1, const char * restrict s2, size_t n) |
| { |
| char *t1 = s1; |
| const char *t2 = s2; |
| while(n-- > 0) |
| *t1++ = *t2++; |
| return s1; |
| } |
| |
| int |
| main (int argc, char **argv) |
| { |
| const char *hello = "World"; |
| size_t l = strlen (hello) + 1; |
| char *earth = malloc (l); |
| fprintf (stderr, "Hello %s\n", cpy (earth, hello, l)); |
| free (earth); |
| |
| void *bad = malloc (16); |
| bad_restrict_ptr (bad); |
| free (bad); |
| return 0; |
| } |