File: large-aligned-untagging-0.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (75 lines) | stat: -rw-r--r-- 2,416 bytes parent folder | download | duplicates (2)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* { dg-do run } */
/* { dg-require-effective-target hwaddress_exec } */
/* { dg-shouldfail "hwasan" } */
/* Don't really need this option since there are no vararray/alloca objects in
   the interesting function, however it never hurts to make doubly sure and
   make it explicit that we're checking the alternate approach to deallocation.
   */
/* { dg-additional-options "--param hwasan-instrument-allocas=0" } */

/* Handling large aligned variables.
   Large aligned variables take a different code-path through expand_stack_vars
   in cfgexpand.c.  This testcase is just to exercise that code-path.

   The alternate code-path produces a second base-pointer through some
   instructions emitted in the prologue.

   This eventually follows a different code path for untagging when not tagging
   allocas. The untagging needs to work at the top of the frame, and this
   should account for this different base when large aligned variables are
   around.  */
__attribute__ ((noinline))
void * Ident (void * argument)
{
  return argument;
}

#ifndef ALIGNMENT
#define ALIGNMENT
#endif
void __attribute__ ((noinline))
large_alignment_untagging (int num, int *retval, int **big, int **other)
{
  int other_array[100] ALIGNMENT;
  int big_array[100] __attribute__ ((aligned (32)));
  *retval = big_array[num] + other_array[num];
  *big = (int*)Ident(big_array);
  *other = (int*)Ident(other_array);
}

#ifndef ARG
#define ARG 0
#endif

int global;

int __attribute__ ((noinline))
main ()
{
  int retval;
  int *big, *other;
  large_alignment_untagging (0, &retval, &big, &other);
  /* Want to test that both ends of both variables are untagged.  */
  switch (ARG) {
    case 0:
      global += big[0];
      break;
    case 1:
      global += big[99];
      break;
    case 2:
      global += other[0];
      break;
    case 3:
      global += other[99];
      break;
  }
  return 0;
}

/* { dg-output "HWAddressSanitizer: tag-mismatch on address 0x\[0-9a-f\]*.*" } */
/* NOTE: This assumes the current tagging mechanism (one at a time from the
   base and large aligned variables being handled first).  */
/* { dg-output "READ of size 4 at 0x\[0-9a-f\]* tags: \[\[:xdigit:\]\]\[\[:xdigit:\]\]/\[\[:xdigit:\]\]\[\[:xdigit:\]\] \\(ptr/mem\\) in thread T0.*" } */
/* { dg-output "Address 0x\[0-9a-f\]* is located in stack of thread T0.*" } */
/* { dg-output "SUMMARY: HWAddressSanitizer: tag-mismatch \[^\n\]*.*" } */