Skip to content

Commit

Permalink
Enable ABSL_BTREE_ENABLE_GENERATIONS and ABSL_SWISSTABLE_ENABLE_GENER…
Browse files Browse the repository at this point in the history
…ATIONS with ABSL_HAVE_HWADDRESS_SANITIZER.

It will detect bugs similar to Asan.

Also updated related tests to pass with HWASAN.
They are still flaky because of nature of HWASAN algorithm,
but test can be update to avoid flakiness, which I will do
in followup patches.

PiperOrigin-RevId: 597613798
Change-Id: Ic8af36a268ca041c002eb561b946aa2d9b93996a
  • Loading branch information
Abseil Team authored and copybara-github committed Jan 11, 2024
1 parent a00f6d6 commit 3acbe29
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 10 deletions.
13 changes: 7 additions & 6 deletions absl/container/btree_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1346,7 +1346,8 @@ void ExpectOperationCounts(const int expected_moves,
tracker->ResetCopiesMovesSwaps();
}

#ifdef ABSL_HAVE_ADDRESS_SANITIZER
#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
defined(ABSL_HAVE_HWADDRESS_SANITIZER)
constexpr bool kAsan = true;
#else
constexpr bool kAsan = false;
Expand Down Expand Up @@ -3079,10 +3080,10 @@ TEST(Btree, InvalidIteratorUse) {
if (!BtreeGenerationsEnabled())
GTEST_SKIP() << "Generation validation for iterators is disabled.";

// Invalid memory use can trigger heap-use-after-free in ASan or invalidated
// iterator assertions.
// Invalid memory use can trigger use-after-free in ASan, HWASAN or
// invalidated iterator assertions.
constexpr const char *kInvalidMemoryDeathMessage =
"heap-use-after-free|invalidated iterator";
"use-after-free|invalidated iterator";

{
absl::btree_set<int> set;
Expand Down Expand Up @@ -3411,12 +3412,12 @@ TEST(Btree, InvalidPointerUse) {
set.insert(0);
const int *ptr = &*set.begin();
set.insert(1);
EXPECT_DEATH(std::cout << *ptr, "heap-use-after-free");
EXPECT_DEATH(std::cout << *ptr, "use-after-free");
size_t slots_per_node = BtreeNodePeer::GetNumSlotsPerNode<decltype(set)>();
for (int i = 2; i < slots_per_node - 1; ++i) set.insert(i);
ptr = &*set.begin();
set.insert(static_cast<int>(slots_per_node));
EXPECT_DEATH(std::cout << *ptr, "heap-use-after-free");
EXPECT_DEATH(std::cout << *ptr, "use-after-free");
}

template<typename Set>
Expand Down
4 changes: 3 additions & 1 deletion absl/container/internal/btree.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ namespace container_internal {
#ifdef ABSL_BTREE_ENABLE_GENERATIONS
#error ABSL_BTREE_ENABLE_GENERATIONS cannot be directly set
#elif defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
defined(ABSL_HAVE_HWADDRESS_SANITIZER) || \
defined(ABSL_HAVE_MEMORY_SANITIZER)
// When compiled in sanitizer mode, we add generation integers to the nodes and
// iterators. When iterators are used, we validate that the container has not
Expand Down Expand Up @@ -2856,7 +2857,8 @@ inline auto btree<P>::internal_emplace(iterator iter, Args &&...args)
}
}
(void)replaced_node;
#ifdef ABSL_HAVE_ADDRESS_SANITIZER
#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
defined(ABSL_HAVE_HWADDRESS_SANITIZER)
if (!replaced_node) {
assert(iter.node_->is_leaf());
if (iter.node_->is_root()) {
Expand Down
1 change: 1 addition & 0 deletions absl/container/internal/raw_hash_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ namespace container_internal {
#ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS
#error ABSL_SWISSTABLE_ENABLE_GENERATIONS cannot be directly set
#elif defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
defined(ABSL_HAVE_HWADDRESS_SANITIZER) || \
defined(ABSL_HAVE_MEMORY_SANITIZER)
// When compiled in sanitizer mode, we add generation integers to the backing
// array and iterators. In the backing array, we store the generation between
Expand Down
6 changes: 3 additions & 3 deletions absl/container/internal/raw_hash_set_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2218,10 +2218,10 @@ TEST(TableDeathTest, InvalidIteratorAsserts) {
EXPECT_DEATH_IF_SUPPORTED(++iter, kErasedDeathMessage);
}

// Invalid iterator use can trigger heap-use-after-free in asan,
// Invalid iterator use can trigger use-after-free in asan/hwasan,
// use-of-uninitialized-value in msan, or invalidated iterator assertions.
constexpr const char* kInvalidIteratorDeathMessage =
"heap-use-after-free|use-of-uninitialized-value|invalidated "
"use-after-free|use-of-uninitialized-value|invalidated "
"iterator|Invalid iterator|invalid iterator";

// MSVC doesn't support | in regex.
Expand Down Expand Up @@ -2579,7 +2579,7 @@ TEST(Table, InvalidReferenceUseCrashesWithSanitizers) {
// ptr will become invalidated on rehash.
const int64_t* ptr = &*t.begin();
t.insert(++i);
EXPECT_DEATH_IF_SUPPORTED(std::cout << *ptr, "heap-use-after-free") << i;
EXPECT_DEATH_IF_SUPPORTED(std::cout << *ptr, "use-after-free") << i;
}
}

Expand Down

0 comments on commit 3acbe29

Please sign in to comment.