一组测试sigset的样例

fickle
🔖︎ 6 订阅
👍︎ 8 点赞

测试通过不通过不保证正确性,我把我碰到的一些错误加到了里面,主要是边界的判断,返回值的判断与功能的判断。

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
#include <lib.h>

#define assert(x) \
do { \
if (!(x)) { \
user_panic("assertion failed: %s", #x); \
} \
} while (0)

void sigint_handler(int sig) {
debugf("sth unexpected happened\n");
exit();
}

int main() {
sigset_t st1, st2, st3, st4;
u_int _st1 = 0x289ca9ed, _st2 = 0xab3cfe27;
assert(sigemptyset(&st1) == 0);
assert(sigemptyset(&st2) == 0);
for(int i = 0; i <= 10; i++) {
if (i != SIG_BLOCK && i != SIG_UNBLOCK && i != SIG_SETMASK) {
assert(sigprocmask(i, &st1, &st2) == -1);
}
}
assert(sigaddset(&st1, 0) == -1);
assert(sigdelset(&st1, 33) == -1);
assert(sigismember(&st1, 321) == -1);
assert(sigisemptyset(&st1) == 1);
assert(sigfillset(&st1) == 0);
for(int i = 0; i < 32; i++) {
if (!(_st1 >> i & 1)) {
assert(sigdelset(&st1, i + 1) == 0);
}
if (_st2 >> i & 1) {
assert(sigaddset(&st2, i + 1) == 0);
}
}
for(int i = 0; i < 32; i++) {
assert(sigismember(&st1, i + 1) == (_st1 >> i & 1));
assert(sigismember(&st2, i + 1) == (_st2 >> i & 1));
}
assert(sigandset(&st3, &st1, &st2) == 0);
for(int i = 0; i < 32; i++) {
assert(sigismember(&st3, i + 1) == ((_st1 & _st2) >> i & 1));
}
assert(sigorset(&st3, &st1, &st2) == 0);
for(int i = 0; i < 32; i++) {
assert(sigismember(&st3, i + 1) == ((_st1 | _st2) >> i & 1));
}
assert(sigprocmask(SIG_BLOCK, NULL, NULL) == 0);
assert(sigprocmask(SIG_BLOCK, &st3, &st4) == 0);
for(int i = 0; i < 32; i++) {
assert(sigismember(&st4, i + 1) == 0);
}
assert(sigprocmask(SIG_UNBLOCK, &st1, &st4) == 0);
for(int i = 0; i < 32; i++) {
assert(sigismember(&st4, i + 1) == ((_st2 | _st1) >> i & 1));
}
assert(sigprocmask(SIG_SETMASK, &st1, &st4) == 0);
for(int i = 0; i < 32; i++) {
assert(sigismember(&st4, i + 1) == ((_st2 & ~_st1) >> i & 1));
}
assert(sigprocmask(SIG_SETMASK, NULL, &st4) == 0);
for(int i = 0; i < 32; i++) {
assert(sigismember(&st4, i + 1) == (_st1 >> i & 1));
}
struct sigaction sa, sa2;
sa.sa_handler = sigint_handler;
assert(sigemptyset(&sa.sa_mask) == 0);
assert(sigaction(SIGSEGV, &sa, NULL) == 0);
assert(sigaction(SIGSEGV, NULL, &sa2) == 0);
assert(sa2.sa_handler == sa.sa_handler);
assert(sigaction(0, &sa, NULL) == -1);
assert(sigaction(33, &sa, NULL) == -1);
assert(sigaction(32, NULL, NULL) == 0);
debugf("Congratulations!\n");
debugf("Congratulations!\n");
debugf("Congratulations!\n");
debugf("Congratulations!\n");
debugf("Congratulations!\n");
debugf("Congratulations!\n");
return 0;
}

回复主题帖

MC的大虾1472
👍︎ 2 点赞

我跑了一下,已经assertion failed了,找了一下出在使用sigprocmask的时候,我仿照Linux的做法,在上传新的mask之后把mask里面SIGKILL对应的位置0,而如果去掉这一步就能通过这个测试

0%