Skip to content

Commit ba95571

Browse files
authored
Merge pull request #49005 from makortel/cmsTraceFunctionSegfault
Add tests for `cmsTraceFunction` for various failures of the traced program
2 parents d8727f7 + df33c92 commit ba95571

File tree

5 files changed

+148
-0
lines changed

5 files changed

+148
-0
lines changed

Utilities/ReleaseScripts/test/BuildFile.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
<test name="test-cmsTraceFunction-setenv" command="gdb/test-cmsTraceFunction-setenv.sh">
88
<use name="gdb"/>
99
</test>
10+
<test name="test-cmsTraceFunction-failure" command="gdb/test-cmsTraceFunction-failure.sh">
11+
<use name="gdb"/>
12+
</test>
1013
<test name="test-clang-tidy" command="test-clang-tidy.sh">
1114
<use name="llvm"/>
1215
</test>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <iostream>
2+
#include <cassert>
3+
#include <cstdlib>
4+
5+
class ScheduleItems {
6+
public:
7+
ScheduleItems() {}
8+
void initMisc();
9+
};
10+
11+
void ScheduleItems::initMisc() { std::cout << "ScheduleItems::initMisc() called" << std::endl; }
12+
13+
void my_assert() { assert(false && "Intentional assert failure"); }
14+
15+
int main(int argc, char** argv) {
16+
if (argc > 1) {
17+
std::string_view opt{argv[1]};
18+
if (opt == "before") {
19+
my_assert();
20+
} else if (opt == "after") {
21+
ScheduleItems obj;
22+
obj.initMisc();
23+
my_assert();
24+
}
25+
}
26+
return 0;
27+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/bin/bash -ex
2+
3+
TRACE="cmsTraceFunction --startAfterFunction ScheduleItems::initMisc setenv"
4+
5+
check_failure() {
6+
local test_name="$1"
7+
local check_func="$2"
8+
local exe_name="test-cmsTraceFunction-${test_name}"
9+
local src_name="${exe_name}.cpp"
10+
11+
g++ -o "$exe_name" "$(dirname $0)/$src_name"
12+
13+
for when in before after; do
14+
local log="${test_name}_${when}.log"
15+
set +e
16+
$TRACE ./$exe_name $when 2>&1 > "$log"
17+
local ret=$?
18+
set -e
19+
20+
if [ ${ret} = 0 ]; then
21+
echo "cmsTraceFunction for ${test_name} ${when} exited with exit code 0, expected non-zero exit code"
22+
exit 1
23+
fi
24+
25+
if [ -n "${check_func}" ]; then
26+
${check_func} ${log}
27+
fi
28+
done
29+
30+
log_after="${test_name}_after.log"
31+
if ! grep -q "ScheduleItems::initMisc() called" ${log_after}; then
32+
echo "Did not find expected ScheduleItems::initMisc call in ${log_after}"
33+
exit 1
34+
fi
35+
}
36+
37+
# Non-zero exit code
38+
check_failure "nonzero"
39+
40+
# Assertion failure
41+
check_assert_log() {
42+
local logfile="$1"
43+
if ! grep -q "signal SIGABRT" ${logfile}; then
44+
echo "Did not find signal message in ${logfile}"
45+
exit 1
46+
fi
47+
if ! grep -q "in my_assert" ${logfile}; then
48+
echo "Did not find my_assert function stack trace in ${logfile}"
49+
exit 1
50+
fi
51+
}
52+
check_failure "assert" check_assert_log
53+
54+
# Segfault
55+
check_segfault_log() {
56+
local logfile="$1"
57+
if ! grep -q "signal SIGSEGV" ${logfile}; then
58+
echo "Did not find signal message in ${logfile}"
59+
exit 1
60+
fi
61+
if ! grep -q "in my_segfault" ${logfile}; then
62+
echo "Did not find my_segfault function in stack trace in ${logfile}"
63+
exit 1
64+
fi
65+
}
66+
check_failure "segfault"
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <iostream>
2+
#include <cstdlib>
3+
4+
class ScheduleItems {
5+
public:
6+
ScheduleItems() {}
7+
void initMisc();
8+
};
9+
10+
void ScheduleItems::initMisc() { std::cout << "ScheduleItems::initMisc() called" << std::endl; }
11+
12+
int main(int argc, char** argv) {
13+
if (argc > 1) {
14+
std::string_view opt{argv[1]};
15+
if (opt == "before") {
16+
return 1;
17+
} else if (opt == "after") {
18+
ScheduleItems obj;
19+
obj.initMisc();
20+
return 1;
21+
}
22+
}
23+
return 0;
24+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <iostream>
2+
#include <cassert>
3+
#include <cstdlib>
4+
#include <csignal>
5+
6+
class ScheduleItems {
7+
public:
8+
ScheduleItems() {}
9+
void initMisc();
10+
};
11+
12+
void ScheduleItems::initMisc() { std::cout << "ScheduleItems::initMisc() called" << std::endl; }
13+
14+
void my_segfault() { raise(SIGSEGV); }
15+
16+
int main(int argc, char** argv) {
17+
if (argc > 1) {
18+
std::string_view opt{argv[1]};
19+
if (opt == "before") {
20+
my_segfault();
21+
} else if (opt == "after") {
22+
ScheduleItems obj;
23+
obj.initMisc();
24+
my_segfault();
25+
}
26+
}
27+
return 0;
28+
}

0 commit comments

Comments
 (0)