File: regression

package info (click to toggle)
bpftrace 0.24.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 10,496 kB
  • sloc: cpp: 60,982; ansic: 10,952; python: 953; yacc: 665; sh: 536; lex: 295; makefile: 22
file content (148 lines) | stat: -rw-r--r-- 5,958 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
# https://github.com/bpftrace/bpftrace/pull/566#issuecomment-487295113
NAME codegen_struct_save_nested
PROG struct Foo { int m; struct { int x; int y; } bar; int n; } begin { @foo = (struct Foo *)0; @bar = @foo->bar; @x = @foo->bar.x; printf("_%s_\n", "done");  }
EXPECT _done_
TIMEOUT 1

NAME logical_and_or_different_sizes
PROG struct Foo { int m; } uprobe:./testprogs/simple_struct:func { $foo = (struct Foo*)arg0; printf("%d %d %d %d %d\n", $foo->m, $foo->m && 0, 1 && $foo->m, $foo->m || 0, 0 || $foo->m); exit(); }
AFTER ./testprogs/simple_struct
EXPECT 2 0 1 1 1

# https://github.com/bpftrace/bpftrace/issues/759
# Update test once https://github.com/bpftrace/bpftrace/pull/781 lands
# NAME ntop_map_printf
# RUN {{BPFTRACE}} -e 'union ip { char v4[4]; char v6[16]; } uprobe:./testprogs/ntop:test_ntop { @a = ntop(2, ((union ip*)arg0)->v4); printf("v4: %s; ", @a); @b = ntop(10, ((union ip*)arg1)->v6); exit() } end { printf("v6: %s", @b); clear(@a); clear(@b) }'
# AFTER ./testprogs/ntop
# EXPECT v4: 127.0.0.1; v6: ffee:ffee:ddcc:ddcc:bbaa:bbaa:c0a8:1
# TIMEOUT 1

NAME modulo_operator
PROG begin { @x = 4; printf("%d\n", @x % 2); exit() }
EXPECT 0

# More details: https://github.com/bpftrace/bpftrace/issues/4379
NAME bad_modulo_optimization
PROG BEGIN { @mod1 = 1; @mod0 = 0; print((uint64)10 % (uint64)@mod1); }
EXPECT 0
TIMEOUT 1

# For a modulo operation where the RHS is 0 we treat the result as 1
NAME zero_modulo
PROG BEGIN { @mod1 = 1; @mod0 = 0; print((uint64)10 % (uint64)@mod0); }
EXPECT 1
EXPECT stdin:1:48-49: WARNING: Divide or modulo by 0 detected. This can lead to unexpected results. 1 is being used as the result.
TIMEOUT 1

# For a division operation where the RHS is 0 we treat the result as 1
NAME zero_divide
PROG BEGIN { @mod1 = 1; @mod0 = 0; print((uint64)10 / (uint64)@mod0); }
EXPECT 1
EXPECT stdin:1:48-49: WARNING: Divide or modulo by 0 detected. This can lead to unexpected results. 1 is being used as the result.
TIMEOUT 1

NAME c_array_indexing
RUN {{BPFTRACE}} -e 'struct Foo { int a; uint8_t b[10]; } uprobe:testprogs/uprobe_test:uprobeFunction2 { $foo = (struct Foo *)arg0; printf("%c %c %c %c %c\n", $foo->b[0], $foo->b[1], $foo->b[2], $foo->b[3], $foo->b[4]) }' -c ./testprogs/uprobe_test
EXPECT h e l l o

# https://github.com/bpftrace/bpftrace/issues/1773
NAME single_arg_wildcard_listing
RUN {{BPFTRACE}} -l "*do_nanosleep*"
EXPECT kprobe:do_nanosleep
TIMEOUT 1

NAME single_arg_wildcard_listing_tracepoint
RUN {{BPFTRACE}} -l "*sched_switch*"
EXPECT tracepoint:sched:sched_switch
TIMEOUT 1

# https://github.com/bpftrace/bpftrace/issues/1952
NAME async_id_invalid_probe_expansion
PROG config = { missing_probes=warn } kprobe:zzzzz { probe; printf("asdf\n") } begin { printf("_%s_\n", "success"); exit() }
EXPECT _success_
TIMEOUT 1

NAME strncmp_n_longer_than_buffer
PROG begin { printf("_%d_\n", strncmp("wow", comm, 17)); exit() }
EXPECT _1_
TIMEOUT 1

NAME strncmp_checks_for_nul
PROG begin { printf("_%d_\n", strncmp("one", "one ", 4)); exit() }
EXPECT _1_
TIMEOUT 1

NAME string compare with empty
PROG begin { if ("hello" == "") { printf("equal"); } else { printf("not equal"); }  }
EXPECT not equal
TIMEOUT 3

NAME string compare with prefix
PROG begin { if ("hello" == "hell") { printf("equal"); } else { printf("not equal"); }  }
EXPECT not equal
TIMEOUT 3

NAME strncmp with prefix
PROG begin { if (strncmp("hello", "hell", 5) == 0) { printf("equal"); } else { printf("not equal"); }  }
EXPECT not equal
TIMEOUT 3

# The issue this test catches is the verifier doesn't allow multiple ALU ops on ctx pointer.
# ctx+const is ok, but ctx+const+const is not ok.
NAME access ctx struct field twice
PROG tracepoint:sched:sched_wakeup { if (args.comm == "asdf") { print(args.comm) } exit(); }
EXPECT Attached 1 probe
TIMEOUT 1

# https://github.com/bpftrace/bpftrace/issues/2135
NAME address_probe_invalid_expansion
RUN {{BPFTRACE}} -e "uprobe:./testprogs/uprobe_test:0x$(nm ./testprogs/uprobe_test | awk '$3 == "uprobeFunction1" {print $1}') { @[probe] = count(); exit() }"
EXPECT Attached 1 probe
TIMEOUT 1

# The verifier is not able to track BTF info for double pointer dereferences and
# array accesses so we must use bpf_probe_read_kernel, otherwise the program is
# rejected. The below two tests make sure that we handle such situations.
NAME fentry double pointer dereference
PROG fentry:__module_get { print((*args.module->trace_events)->flags); exit(); }
AFTER lsmod
REQUIRES_FEATURE fentry
EXPECT Attached 1 probe
TIMEOUT 1

NAME fentry double pointer array access
PROG fentry:__module_get { print(args.module->trace_events[1]->flags); exit(); }
AFTER lsmod
REQUIRES_FEATURE fentry
EXPECT Attached 1 probe
TIMEOUT 1

NAME fentry array access via pointer
PROG fentry:__module_get { print(args.module->version[0]); exit(); }
AFTER lsmod
REQUIRES_FEATURE fentry
EXPECT Attached 1 probe
TIMEOUT 1

NAME unaligned key with aligned value
PROG begin { @mapA["aaaabbb", 0] = 1; @mapA["ccccdddd", 0] = 1; }
EXPECT Attached 1 probe
TIMEOUT 1

# In some cases, LLVM can generate code that violates the BPF verifier
# constraint that the context pointer is not modified prior to access (see
# #3603). #3629 introduces the use of intrinsics that should ensure that this
# doesn't happen, but this runtime test exercises a pattern that previously
# produced code that failed to verify.
NAME preserve context pointer
PROG begin { @test[(uint64)1] = (uint64)1; } tracepoint:syscalls:sys_enter_kill { if (strcontains(comm, "test")) { @test[args.pid] = 1; } if (args.pid == @test[1]) { print((1)); } if (args.pid == @test[1]) { print((1));  } }
EXPECT Attached 2 probes
TIMEOUT 1

# Ensure scratch buffers for map keys are created for aggregate map
# functions like `count()` and `sum()`
# https://github.com/bpftrace/bpftrace/issues/4669
NAME map key scratch buffer for map aggregates
PROG config = { on_stack_limit = 0 }  begin { @a[pid, comm, "reallylongstr"] = count(); }
EXPECT Attached 1 probe
TIMEOUT 1