mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
// 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;
|
|
}
|