Fix DEBUG_VERBOSE print of uninitialized Result::endRemaining
CI / test (arm64, -DCMAKE_BUILD_TYPE=Debug -DMSAN_TOOLCHAIN_PATH=/opt/msan, 22, https://minio.weaselab.dev/public/aarch64/msan-toolchain-22.1.8.tar.zst, debug-arm64, ubuntu-latest-arm64) (pull_request) Successful in 3m45s
CI / release (arm64, , ubuntu-latest-arm64) (pull_request) Successful in 3m17s
CI / pre-commit (pull_request) Successful in 2m6s
CI / test (amd64, -DCMAKE_BUILD_TYPE=Debug -DMSAN_TOOLCHAIN_PATH=/opt/msan, 21, https://minio.weaselab.dev/public/x86_64/msan-toolchain-21.1.8.tar.zst, debug, ubuntu-latest-amd64) (pull_request) Successful in 3m54s
CI / test (amd64, -DCMAKE_CXX_FLAGS=-DUSE_64_BIT=1, 21, , 64-bit-versions, ubuntu-latest-amd64) (pull_request) Successful in 3m26s
CI / test (amd64, -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++, 21, , gcc, ubuntu-latest-amd64) (pull_request) Successful in 3m19s
CI / test (amd64, -DUSE_SIMD_FALLBACK=ON, 21, , simd-fallback, ubuntu-latest-amd64) (pull_request) Successful in 3m27s
CI / release (amd64, -DMSAN_TOOLCHAIN_PATH=/opt/msan, ubuntu-latest-amd64) (pull_request) Successful in 5m41s
CI / coverage (pull_request) Successful in 3m52s

Point writes are recorded with the 2-argument interleaved_insert::Result
constructor, which left endRemaining (and nextRangeWrite) indeterminate.
The Phase 2 debug print then unconditionally printed endRemaining, so any
DEBUG_VERBOSE && !NDEBUG build read an indeterminate span and, with stack
garbage from a previous call, dereferenced a freed pointer. Initialize the
range-only members in both constructors, and only print the end search
path/spans for range writes.
This commit is contained in:
weaselbot committed 2026-10-26 19:19:43 -04:00
1 parent ba781b8875
commit c45d3cba81
1 file changed
+8 -5
+8 -5
View File
@@ -3904,11 +3904,12 @@ struct Result {
Result() = default;
Result(Node *insertionPoint, TrivialSpan remaining)
: insertionPoint(insertionPoint), remaining(remaining),
endInsertionPoint(nullptr) {}
endInsertionPoint(nullptr), endRemaining{}, nextRangeWrite(nullptr) {}
Result(Node *insertionPoint, TrivialSpan remaining, Node *endInsertionPoint,
TrivialSpan endRemaining)
: insertionPoint(insertionPoint), remaining(remaining),
endInsertionPoint(endInsertionPoint), endRemaining(endRemaining) {}
endInsertionPoint(endInsertionPoint), endRemaining(endRemaining),
nextRangeWrite(nullptr) {}
Node *insertionPoint;
TrivialSpan remaining;
@@ -4979,9 +4980,11 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
fprintf(stderr, "search path: %s, begin: %s\n",
getSearchPathPrintable(b).c_str(),
printable(context.results[i].remaining).c_str());
fprintf(stderr, "search path: %s, end: %s\n",
getSearchPathPrintable(e).c_str(),
printable(context.results[i].endRemaining).c_str());
if (e != nullptr) {
fprintf(stderr, "search path: %s, end: %s\n",
getSearchPathPrintable(e).c_str(),
printable(context.results[i].endRemaining).c_str());
}
}
#endif