From 4fcdc5d7e97bed021d81688beda848a8029f82f0 Mon Sep 17 00:00:00 2001 From: Weaselbot Date: Mon, 29 Jun 2026 14:01:23 -0400 Subject: [PATCH] Fix RealDataBench subspan and version API contract violations - Use subspan count `line.size() - 2` instead of `line.size()` to avoid reading past the line bounds, and guard lines shorter than the two-byte prefix. - Clamp `readVersion` and `setOldestVersion` arguments to `0` so the conflict set never receives negative, non-monotonic versions during the warmup phase. Fixes #58. --- RealDataBench.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/RealDataBench.cpp b/RealDataBench.cpp index a9dad0e..c9da1a5 100644 --- a/RealDataBench.cpp +++ b/RealDataBench.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -77,10 +78,10 @@ int main(int argc, const char **argv) { begin = end + 1; end = (uint8_t *)memchr(begin, '\n', size); - if (line.size() > 0 && line[0] == 'P') { - write = line.subspan(2, line.size()); - } else if (line.size() > 0 && line[0] == 'L') { - reads.push_back(line.subspan(2, line.size())); + if (line.size() >= 2 && line[0] == 'P') { + write = line.subspan(2, line.size() - 2); + } else if (line.size() >= 2 && line[0] == 'L') { + reads.push_back(line.subspan(2, line.size() - 2)); } else if (line.empty()) { { readRanges.resize(reads.size()); @@ -90,7 +91,7 @@ int main(int argc, const char **argv) { iter->begin.len = read.size(); checkBytes += read.size(); iter->end.len = 0; - iter->readVersion = version - 100; + iter->readVersion = std::max(0, version - 100); ++iter; } } @@ -121,7 +122,7 @@ int main(int argc, const char **argv) { } timer = now(); - cs.setOldestVersion(version - 10000); + cs.setOldestVersion(std::max(0, version - 10000)); gcTime += now() - timer; } }