File: harden-cfr-tail-ub.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A14.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,099,328 kB
  • sloc: cpp: 3,627,108; ansic: 2,571,498; ada: 834,230; f90: 235,082; makefile: 79,231; asm: 74,984; xml: 51,692; exp: 39,736; sh: 33,298; objc: 15,629; python: 15,069; fortran: 14,429; pascal: 7,003; awk: 5,070; perl: 3,106; ml: 285; lisp: 253; lex: 204; haskell: 135
file content (40 lines) | stat: -rw-r--r-- 1,666 bytes parent folder | download
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
/* { dg-do compile } */
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-returning-calls -fno-hardcfr-check-exceptions -fdump-tree-hardcfr -ffat-lto-objects -Wno-return-type" } */

/* In C only, check some additional cases (comparing with
   c-c++-common/torture/harden-cfr-tail.c) of falling off the end of non-void
   function.  C++ would issue an unreachable call in these cases.  */

extern int g (int i);

int f1(int i) {
  /* Inline check before the returning call, that doesn't return anything.  */
  g (i);
  /* Implicit return without value, despite the return type; this combination
     enables tail-calling of g, and is recognized as a returning call.  */
}

extern void g2 (int i);

int f2(int i) {
  /* Inline check before the returning call, that disregards its return
     value.  */
  g2 (i);
  /* Implicit return without value, despite the return type; this combination
     enables tail-calling of g2, and is recognized as a returning call.  */
}

int f3(int i) {
  if (i)
    /* Out-of-line check before the returning call.  */
    return g (i);
  /* Out-of-line check before implicit return.  */
}

/* Out-of-line checks in f3, before returning calls and before return.  */
/* { dg-final { scan-tree-dump-times "hardcfr_check" 2 "hardcfr" } } */
/* Inline checking in all other functions.  */
/* { dg-final { scan-tree-dump-times "__builtin_trap" 2 "hardcfr" } } */
/* Check before tail-call in all functions, but f3 is out-of-line.  */
/* { dg-final { scan-tree-dump-times "Inserting inline check before stmt" 2 "hardcfr" } } */
/* { dg-final { scan-tree-dump-times "Inserting out-of-line check before stmt" 1 "hardcfr" } } */