File: variable

package info (click to toggle)
bpftrace 0.24.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,496 kB
  • sloc: cpp: 60,982; ansic: 10,952; python: 953; yacc: 665; sh: 536; lex: 295; makefile: 22
file content (153 lines) | stat: -rw-r--r-- 4,563 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
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
NAME global_int
PROG i:ms:1 {@a = 10; printf("%d\n", @a); exit();}
EXPECT @a: 10

NAME global_string
PROG i:ms:1 {@a = "hi"; printf("%s\n", @a); exit();}
EXPECT @a: hi

NAME global_buf
PROG i:ms:1 {@a = buf("hi", 2); printf("%r\n", @a); exit();}
EXPECT @a: hi

NAME local_int
PROG i:ms:1  {$a = 10; printf("a=%d\n", $a); exit();}
EXPECT a=10

NAME local_string
PROG i:ms:1  {$a = "hi"; printf("a=%s\n", $a); exit();}
EXPECT a=hi

NAME local_buf
PROG i:ms:1 {$a = buf("hi", 2); printf("a=%r\n", $a); exit();}
EXPECT a=hi

NAME buf_equality
PROG i:ms:1 {$a = buf("hi", 2); $b = buf("bye", 3); printf("equal=%d, unequal=%d\n", $a == $a, $a != $b); exit();}
EXPECT equal=1, unequal=1

NAME global_associative_arrays
PROG begin { @map[123] = 456; } end { printf("val: %d\n", @map[123]);  }
EXPECT val: 456

NAME scratch
PROG begin { @map[123] = 456; } end { $val = @map[123]; printf("val: %d\n", $val);  }
EXPECT val: 456

NAME 32-bit tracepoint arg
PROG tracepoint:syscalls:sys_enter_openat /comm == "syscall"/ { $i = args.flags; printf("openflags: %d\n", $i); if ($i == 64) { exit() } }
EXPECT openflags: 64
AFTER ./testprogs/syscall openat

NAME tracepoint arg casts in predicates
RUN {{BPFTRACE}} -e 'tracepoint:syscalls:sys_enter_wait4 /args.ru/ { @ru[tid] = args.ru; } tracepoint:syscalls:sys_exit_wait4 /@ru[tid]/ { @++; exit(); }' -c ./testprogs/wait4_ru
EXPECT_REGEX @: [1-9][0-9]*

NAME variable string type resize
PROG begin { $x = "hello"; $x = "hi"; printf("%s\n", $x);  }
EXPECT hi
TIMEOUT 2

NAME map string type resize
PROG begin { @ = "hello"; } i:ms:1 { @ = "hi";  }
EXPECT @: hi
TIMEOUT 2

NAME map key string type resize
PROG begin { @["hello"] = 0; } i:ms:1 { @["hi"] = 1;  }
EXPECT @[hi]: 1
TIMEOUT 2

NAME map multi-key string type resize
PROG begin { @["hello", 0] = 0; } i:ms:1 { @["hi", 1] = 1;  }
EXPECT @[hi, 1]: 1
TIMEOUT 2

NAME map tuple string resize
PROG begin { @[1] = ("hi", 1); @[1] = ("hellolongstr", 2); @[1] = ("by", 3);  }
EXPECT @[1]: (by, 3)
TIMEOUT 2

NAME map key tuple string resize
PROG begin { @["hi", 1] = 1; @["hellolongstr", 2] = 2; @["by", 3] = 3;  }
EXPECT @[hi, 1]: 1
EXPECT @[hellolongstr, 2]: 2
EXPECT @[by, 3]: 3
TIMEOUT 2

NAME variable tuple string resize
PROG begin { $a = ("hi", 1); print(($a)); $a = ("hellolongstr", 2); print(($a)); $a = ("by", 3); print(($a));  }
EXPECT (hi, 1)
EXPECT (hellolongstr, 2)
EXPECT (by, 3)
TIMEOUT 2

NAME variable nested tuple string resize
PROG begin { $a = ("hi", ("hellolongstr", 2)); print(($a)); $a = ("hellolongstr", ("hi", 5)); print(($a));  }
EXPECT (hi, (hellolongstr, 2))
EXPECT (hellolongstr, (hi, 5))
TIMEOUT 2

NAME map nested tuple string resize
PROG begin { @[1] = ("hi", ("hellolongstr", 2)); @[1] = ("hellolongstr", ("hi", 5));  }
EXPECT @[1]: (hellolongstr, (hi, 5))
TIMEOUT 2

NAME map key nested tuple string resize
PROG begin { @["hi", ("hellolongstr", 2)] = 1; @["hellolongstr", ("hi", 5)] = 2;  }
EXPECT @[hi, (hellolongstr, 2)]: 1
EXPECT @[hellolongstr, (hi, 5)]: 2
TIMEOUT 2

NAME map key tuple with casted ints
PROG begin { @a[(int16)-1, ((int32)-2, 3)] = 10; @a[5, (6, 7)] = 11; $c = ((int8)-4, ((int16)-5, -6)); @a[$c] = 12;  }
EXPECT @a[-4, (-5, -6)]: 12
EXPECT @a[-1, (-2, 3)]: 10
EXPECT @a[5, (6, 7)]: 11
TIMEOUT 2

NAME variable declaration
PROG begin { let $a; $a = 10; printf("a=%d\n", $a); }
EXPECT a=10

NAME variable declaration with builtin
PROG begin { let $f: struct task_struct *; $f = curtask; print($f->pid); }
EXPECT_REGEX [0-9]+

NAME variable declaration with unresolved type
PROG begin { let $x: struct Foo[1];  }
EXPECT Attached 1 probe

NAME variable declaration not initialized
PROG begin { let $a; if (false) { $a = 1; } @b = $a; }
EXPECT @b: 0

NAME variable doesn't escape scope
RUN {{BPFTRACE}} runtime/scripts/variable_scope.bt
EXPECT 0

NAME late variable declaration
RUN {{BPFTRACE}} runtime/scripts/variable_scope_late_decl.bt
EXPECT (a, 1)
EXPECT (b, 2)
EXPECT (c, 0)

NAME late map evaluation with ctx capture
RUN {{BPFTRACE}} -e 'interval:ms:100 { $x = 1; for ($kv : @a) { print(($x, $kv.0, $kv.1)); exit(); } @a[1] = 1; }'
EXPECT (1, 1, 1)

NAME variable address with int
PROG begin { $a = 1; $b = &$a; print(($b, *$b)); }
EXPECT_REGEX (0x[0-9a-f]+, 1)

NAME variable address with tuple
PROG begin { $a = (1, "hello", 2); print(*(&$a)); }
EXPECT (1, hello, 2)

NAME variable address with string
PROG begin { $a = "hello"; $b = (int8 *)&$a; printf("%c %c\n", *$b, *++$b); }
EXPECT h e

NAME variable address with builtin
PROG begin { $a = username; $b = &$a; printf("SUCCESS %s\n", *$b); }
EXPECT_REGEX SUCCESS .*