Skip to content

Commit 6f36b67

Browse files
committed
chore: Add an undefined behaviour/integer sanitizer build.
1 parent 71d5f8a commit 6f36b67

File tree

7 files changed

+67
-12
lines changed

7 files changed

+67
-12
lines changed

.circleci/cmake-asan

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ CACHEDIR="$HOME/cache"
88
add_flag -Werror
99
add_flag -fdiagnostics-color=always
1010
add_flag -fno-omit-frame-pointer
11-
add_flag -fsanitize=address,undefined
11+
add_flag -fsanitize=address
1212
cmake -B_build -H. -GNinja \
1313
-DCMAKE_C_FLAGS="$C_FLAGS" \
1414
-DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
@@ -28,7 +28,8 @@ cd _build
2828

2929
ninja install -j"$(nproc)"
3030

31-
export ASAN_OPTIONS="detect_invalid_pointer_pairs=1"
31+
export ASAN_OPTIONS="color=always"
32+
export ASAN_OPTIONS="$ASAN_OPTIONS,detect_invalid_pointer_pairs=1"
3233
export ASAN_OPTIONS="$ASAN_OPTIONS,detect_stack_use_after_return=1"
3334
export ASAN_OPTIONS="$ASAN_OPTIONS,strict_init_order=1"
3435
export ASAN_OPTIONS="$ASAN_OPTIONS,strict_string_checks=1"

.circleci/cmake-tsan

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ cd _build
2828

2929
ninja install -j"$(nproc)"
3030

31-
export TSAN_OPTIONS="halt_on_error=1"
31+
export TSAN_OPTIONS="color=always"
32+
export TSAN_OPTIONS="$TSAN_OPTIONS,halt_on_error=1"
3233
export TSAN_OPTIONS="$TSAN_OPTIONS,second_deadlock_stack=1"
3334
export TSAN_OPTIONS="$TSAN_OPTIONS,symbolize=1"
3435
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6

.circleci/cmake-ubsan

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
3+
set -eu
4+
5+
CACHEDIR="$HOME/cache"
6+
7+
. ".github/scripts/flags-$CC.sh"
8+
add_flag -Werror
9+
add_flag -fdiagnostics-color=always
10+
add_flag -fno-omit-frame-pointer
11+
add_flag -fno-sanitize-recover=all
12+
add_flag -fsanitize=undefined,nullability,local-bounds,float-divide-by-zero,integer
13+
add_flag -fno-sanitize=implicit-conversion,unsigned-integer-overflow
14+
cmake -B_build -H. -GNinja \
15+
-DCMAKE_C_FLAGS="$C_FLAGS" \
16+
-DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
17+
-DCMAKE_EXE_LINKER_FLAGS="$LD_FLAGS" \
18+
-DCMAKE_SHARED_LINKER_FLAGS="$LD_FLAGS" \
19+
-DCMAKE_INSTALL_PREFIX:PATH="$PWD/_install" \
20+
-DCMAKE_UNITY_BUILD=ON \
21+
-DMIN_LOGGER_LEVEL=TRACE \
22+
-DMUST_BUILD_TOXAV=ON \
23+
-DNON_HERMETIC_TESTS=ON \
24+
-DSTRICT_ABI=ON \
25+
-DTEST_TIMEOUT_SECONDS=120 \
26+
-DUSE_IPV6=OFF \
27+
-DAUTOTEST=ON
28+
29+
cd _build
30+
31+
ninja install -j"$(nproc)"
32+
33+
export UBSAN_OPTIONS="color=always"
34+
export UBSAN_OPTIONS="$UBSAN_OPTIONS,print_stacktrace=1"
35+
export UBSAN_OPTIONS="$UBSAN_OPTIONS,symbolize=1"
36+
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6

.circleci/config.yml

+11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ workflows:
99
- asan
1010
- tsan
1111
- msan
12+
- ubsan
1213
# Static analysis
1314
- clang-analyze
1415
- clang-tidy
@@ -52,6 +53,16 @@ jobs:
5253
- checkout
5354
- run: CC=clang .circleci/cmake-tsan
5455

56+
ubsan:
57+
working_directory: ~/work
58+
docker:
59+
- image: ubuntu
60+
61+
steps:
62+
- run: *apt_install
63+
- checkout
64+
- run: CC=clang .circleci/cmake-ubsan
65+
5566
msan:
5667
working_directory: ~/work
5768
docker:

.github/settings.yml

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ branches:
3636
- "ci/circleci: msan"
3737
- "ci/circleci: static-analysis"
3838
- "ci/circleci: tsan"
39+
- "ci/circleci: ubsan"
3940
- "cimple"
4041
- "code-review/reviewable"
4142
- "continuous-integration/appveyor/pr"

other/docker/circleci/Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ RUN apt-get update && \
77
clang \
88
cmake \
99
libconfig-dev \
10+
libgtest-dev \
1011
libmsgpack-dev \
1112
libopus-dev \
1213
libsodium-dev \

toxcore/ping_array_test.cc

+13-9
Original file line numberDiff line numberDiff line change
@@ -77,44 +77,48 @@ TEST(PingArray, ZeroLengthDataCanBeAdded) {
7777
Ping_Array_Ptr const arr(ping_array_new(2, 1));
7878
Mono_Time_Ptr const mono_time(mono_time_new());
7979

80-
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), nullptr, 0);
80+
uint8_t c = 0;
81+
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), &c, sizeof(c));
8182
EXPECT_NE(ping_id, 0);
8283

83-
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), 0);
84+
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), 1);
8485
}
8586

8687
TEST(PingArray, PingId0IsInvalid) {
8788
Ping_Array_Ptr const arr(ping_array_new(2, 1));
8889
Mono_Time_Ptr const mono_time(mono_time_new());
8990

90-
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, 0), -1);
91+
uint8_t c = 0;
92+
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), 0), -1);
9193
}
9294

9395
// Protection against replay attacks.
9496
TEST(PingArray, DataCanOnlyBeRetrievedOnce) {
9597
Ping_Array_Ptr const arr(ping_array_new(2, 1));
9698
Mono_Time_Ptr const mono_time(mono_time_new());
9799

98-
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), nullptr, 0);
100+
uint8_t c = 0;
101+
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), &c, sizeof(c));
99102
EXPECT_NE(ping_id, 0);
100103

101-
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), 0);
102-
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), -1);
104+
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), 1);
105+
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), -1);
103106
}
104107

105108
TEST(PingArray, PingIdMustMatchOnCheck) {
106109
Ping_Array_Ptr const arr(ping_array_new(1, 1));
107110
Mono_Time_Ptr const mono_time(mono_time_new());
108111

109-
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), nullptr, 0);
112+
uint8_t c = 0;
113+
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), &c, sizeof(c));
110114
EXPECT_NE(ping_id, 0);
111115

112116
uint64_t const bad_ping_id = ping_id == 1 ? 2 : 1;
113117

114118
// bad_ping_id will also be pointing at the same element, but won't match the
115119
// actual ping_id.
116-
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, bad_ping_id), -1);
117-
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), 0);
120+
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), bad_ping_id), -1);
121+
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), 1);
118122
}
119123

120124
} // namespace

0 commit comments

Comments
 (0)