aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/hwasan/hwasan-thread-access-parent.c
blob: eca27c8cd2c1520e061465c928affb7aeb02b0f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* { dg-do run } */
/* { dg-require-effective-target hwaddress_exec } */
/* { dg-shouldfail "hwasan" } */
/* { dg-additional-options "-lpthread" } */

#include <pthread.h>

#ifdef __cplusplus
extern "C" {
#endif
extern int printf (char const *, ...);
#ifdef __cplusplus
}
#endif
typedef __UINTPTR_TYPE__ uintptr_t;
typedef __UINT64_TYPE__ uint64_t;

/* Test that tags are checked across different threads.
   i.e. if this thread tries to access a different threads memory with the
   incorrect tag, then this thread fails.  */
void *
failing_thread_function (void *argument)
{
    void * other = (void *)((uint64_t)argument & 0xffffffffffffffULL);
    int *num = (int*)argument;
    printf ("(should succeed): first number = %d\n", num[0]);
    printf ("(now should fail):\n");

    int *othernum = (int*)other;
    printf (" second number = %d\n", othernum[0]);
    return (void *)1;
}

int
main (int argc, char **argv)
{
    int argument[100] = {0};
    argument[1] = 10;
    pthread_t thread_index;
    pthread_create (&thread_index, NULL, failing_thread_function, (void*)argument);

    void *retval;
    pthread_join (thread_index, &retval);

    return (uintptr_t)retval;
}

/* { dg-output "HWAddressSanitizer: tag-mismatch on address 0x\[0-9a-f\]*.*" } */
/* { dg-output "READ of size 4 at 0x\[0-9a-f\]* tags: 00/\[\[:xdigit:\]\]\[\[:xdigit:\]\].* \\(ptr/mem\\) in thread T1.*" } */
/* { dg-output "Address 0x\[0-9a-f\]* is located in stack of thread T0.*" } */
/* { dg-output "SUMMARY: HWAddressSanitizer: tag-mismatch \[^\n\]*.*" } */