File: unsafe-buffer-usage-diag-type.cpp

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (109 lines) | stat: -rw-r--r-- 3,625 bytes parent folder | download | duplicates (10)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// RUN: %clang_cc1 -std=c++20 -Wno-all -Wunsafe-buffer-usage \
// RUN:            -fsafe-buffer-usage-suggestions -verify %s

namespace localVar {
void testRefersPtrLocalVarDecl(int i) {
  int * ptr;    // expected-warning{{'ptr' is an unsafe pointer used for buffer access}}
  ptr + i;      // expected-note{{used in pointer arithmetic here}}
  ptr[i];       // expected-note{{used in buffer access here}}
}

void testRefersArrayLocalVarDecl(int i) {
  int array[i];   // expected-warning{{'array' is an unsafe buffer that does not perform bounds}}
  array[i/2];     // expected-note{{used in buffer access here}}
}
}

namespace globalVar {
int * ptr;      // expected-warning{{'ptr' is an unsafe pointer used for buffer access}}
void testRefersPtrGlobalVarDecl(int i) {
  ptr + i;      // expected-note{{used in pointer arithmetic here}}
  ptr[i];       // expected-note{{used in buffer access here}}
}

int array[10];     // expected-warning{{'array' is an unsafe buffer that does not perform bounds}}
void testRefersArrayGlobalVarDecl(int i) {
  array[i/2];     // expected-note{{used in buffer access here}}
}
}

namespace functionParm {
void testRefersPtrParmVarDecl(int * ptr) {
                // expected-warning@-1{{'ptr' is an unsafe pointer used for buffer access}}
  ptr + 5;      // expected-note{{used in pointer arithmetic here}}
  ptr[5];       // expected-note{{used in buffer access here}}
}

// FIXME: shall we explain the array to pointer decay to make the warning more understandable?
void testRefersArrayParmVarDecl(int array[10]) {
                // expected-warning@-1{{'array' is an unsafe pointer used for buffer access}}
  array[2];     // expected-note{{used in buffer access here}}
}
}

namespace structField {
struct Struct1 {
  int * ptr;      // FIXME: per-declaration warning aggregated at the struct definition?
};

void testRefersPtrStructFieldDecl(int i) {
  Struct1 s1;
  s1.ptr + i;     // expected-warning{{unsafe pointer arithmetic}}
  s1.ptr[i];      // expected-warning{{unsafe buffer access}}
}

struct Struct2 {
  int array[10];  // FIXME: per-declaration warning aggregated at the struct definition?
};

void testRefersArrayStructFieldDecl(int i) {
  Struct2 s2;
  s2.array[i/2];  // expected-warning{{unsafe buffer access}}
}
}

namespace structFieldFromMethod {
struct Struct1 {
  int * ptr;      // FIXME: per-declaration warning aggregated at the struct definition

  void testRefersPtrStructFieldDecl(int i) {
    ptr + i;     // expected-warning{{unsafe pointer arithmetic}}
    ptr[i];      // expected-warning{{unsafe buffer access}}
  }
};

struct Struct2 {
  int array[10];  // FIXME: per-declaration warning aggregated at the struct definition

  void testRefersArrayStructFieldDecl(int i) {
    Struct2 s2;
    s2.array[i/2];  // expected-warning{{unsafe buffer access}}
  }
};
}

namespace staticStructField {
struct Struct1 {
  static int * ptr;      // expected-warning{{'ptr' is an unsafe pointer used for buffer access}}
};

void testRefersPtrStructFieldDecl(int i) {
  Struct1::ptr + i;      // expected-note{{used in pointer arithmetic here}}
  Struct1::ptr[i];       // expected-note{{used in buffer access here}}
}

struct Struct2 {
  static int array[10];     // expected-warning{{'array' is an unsafe buffer that does not perform bounds}}
};

void testRefersArrayStructFieldDecl(int i) {
  Struct2::array[i/2];     // expected-note{{used in buffer access here}}
}
}

int * return_ptr();

void testNoDeclRef(int i) {
  return_ptr() + i;   // expected-warning{{unsafe pointer arithmetic}}
  return_ptr()[i];    // expected-warning{{unsafe buffer access}}
}