Skip to content

Commit

Permalink
chore: Add an undefined behaviour/integer sanitizer build.
Browse files Browse the repository at this point in the history
  • Loading branch information
iphydf committed Feb 8, 2022
1 parent 71d5f8a commit 6f36b67
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 12 deletions.
5 changes: 3 additions & 2 deletions .circleci/cmake-asan
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ CACHEDIR="$HOME/cache"
add_flag -Werror
add_flag -fdiagnostics-color=always
add_flag -fno-omit-frame-pointer
add_flag -fsanitize=address,undefined
add_flag -fsanitize=address
cmake -B_build -H. -GNinja \
-DCMAKE_C_FLAGS="$C_FLAGS" \
-DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
Expand All @@ -28,7 +28,8 @@ cd _build

ninja install -j"$(nproc)"

export ASAN_OPTIONS="detect_invalid_pointer_pairs=1"
export ASAN_OPTIONS="color=always"
export ASAN_OPTIONS="$ASAN_OPTIONS,detect_invalid_pointer_pairs=1"
export ASAN_OPTIONS="$ASAN_OPTIONS,detect_stack_use_after_return=1"
export ASAN_OPTIONS="$ASAN_OPTIONS,strict_init_order=1"
export ASAN_OPTIONS="$ASAN_OPTIONS,strict_string_checks=1"
Expand Down
3 changes: 2 additions & 1 deletion .circleci/cmake-tsan
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ cd _build

ninja install -j"$(nproc)"

export TSAN_OPTIONS="halt_on_error=1"
export TSAN_OPTIONS="color=always"
export TSAN_OPTIONS="$TSAN_OPTIONS,halt_on_error=1"
export TSAN_OPTIONS="$TSAN_OPTIONS,second_deadlock_stack=1"
export TSAN_OPTIONS="$TSAN_OPTIONS,symbolize=1"
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6
36 changes: 36 additions & 0 deletions .circleci/cmake-ubsan
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/bin/bash

set -eu

CACHEDIR="$HOME/cache"

. ".github/scripts/flags-$CC.sh"
add_flag -Werror
add_flag -fdiagnostics-color=always
add_flag -fno-omit-frame-pointer
add_flag -fno-sanitize-recover=all
add_flag -fsanitize=undefined,nullability,local-bounds,float-divide-by-zero,integer
add_flag -fno-sanitize=implicit-conversion,unsigned-integer-overflow
cmake -B_build -H. -GNinja \
-DCMAKE_C_FLAGS="$C_FLAGS" \
-DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
-DCMAKE_EXE_LINKER_FLAGS="$LD_FLAGS" \
-DCMAKE_SHARED_LINKER_FLAGS="$LD_FLAGS" \
-DCMAKE_INSTALL_PREFIX:PATH="$PWD/_install" \
-DCMAKE_UNITY_BUILD=ON \
-DMIN_LOGGER_LEVEL=TRACE \
-DMUST_BUILD_TOXAV=ON \
-DNON_HERMETIC_TESTS=ON \
-DSTRICT_ABI=ON \
-DTEST_TIMEOUT_SECONDS=120 \
-DUSE_IPV6=OFF \
-DAUTOTEST=ON

cd _build

ninja install -j"$(nproc)"

export UBSAN_OPTIONS="color=always"
export UBSAN_OPTIONS="$UBSAN_OPTIONS,print_stacktrace=1"
export UBSAN_OPTIONS="$UBSAN_OPTIONS,symbolize=1"
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6
11 changes: 11 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ workflows:
- asan
- tsan
- msan
- ubsan
# Static analysis
- clang-analyze
- clang-tidy
Expand Down Expand Up @@ -52,6 +53,16 @@ jobs:
- checkout
- run: CC=clang .circleci/cmake-tsan

ubsan:
working_directory: ~/work
docker:
- image: ubuntu

steps:
- run: *apt_install
- checkout
- run: CC=clang .circleci/cmake-ubsan

msan:
working_directory: ~/work
docker:
Expand Down
1 change: 1 addition & 0 deletions .github/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ branches:
- "ci/circleci: msan"
- "ci/circleci: static-analysis"
- "ci/circleci: tsan"
- "ci/circleci: ubsan"
- "cimple"
- "code-review/reviewable"
- "continuous-integration/appveyor/pr"
Expand Down
1 change: 1 addition & 0 deletions other/docker/circleci/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ RUN apt-get update && \
clang \
cmake \
libconfig-dev \
libgtest-dev \
libmsgpack-dev \
libopus-dev \
libsodium-dev \
Expand Down
22 changes: 13 additions & 9 deletions toxcore/ping_array_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -77,44 +77,48 @@ TEST(PingArray, ZeroLengthDataCanBeAdded) {
Ping_Array_Ptr const arr(ping_array_new(2, 1));
Mono_Time_Ptr const mono_time(mono_time_new());

uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), nullptr, 0);
uint8_t c = 0;
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), &c, sizeof(c));
EXPECT_NE(ping_id, 0);

EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), 0);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), 1);
}

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

EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, 0), -1);
uint8_t c = 0;
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), 0), -1);
}

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

uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), nullptr, 0);
uint8_t c = 0;
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), &c, sizeof(c));
EXPECT_NE(ping_id, 0);

EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), 0);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), -1);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), 1);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), -1);
}

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

uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), nullptr, 0);
uint8_t c = 0;
uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), &c, sizeof(c));
EXPECT_NE(ping_id, 0);

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

// bad_ping_id will also be pointing at the same element, but won't match the
// actual ping_id.
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, bad_ping_id), -1);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), nullptr, 0, ping_id), 0);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), bad_ping_id), -1);
EXPECT_EQ(ping_array_check(arr.get(), mono_time.get(), &c, sizeof(c), ping_id), 1);
}

} // namespace

0 comments on commit 6f36b67

Please sign in to comment.