Skip to content

Commit db619db

Browse files
committed
Fix some undefined behaviors
- RareErrorIterator was passing probabilities 0 and 1 into std::geometric_distribution>- - command_sample.test.cc was checking for '\0' past the end of a std::string_view
1 parent 75d9cb1 commit db619db

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

src/stim/cmd/command_sample.test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ std::unordered_map<std::string_view, size_t> line_freq_with_lifetime_matching_ar
2626
std::unordered_map<std::string_view, size_t> result{};
2727
size_t start = 0;
2828
for (size_t k = 0; k <= data.size(); k++) {
29-
if (data[k] == '\n' || data[k] == '\0') {
29+
if (k == data.size() || data[k] == '\n' || data[k] == '\0') {
3030
result[data.substr(start, k - start)]++;
3131
start = k + 1;
3232
}

src/stim/util_bot/probability_util.cc

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,25 @@
2121
using namespace stim;
2222

2323
RareErrorIterator::RareErrorIterator(float probability)
24-
: next_candidate(0), is_one(probability == 1), dist(probability) {
24+
: next_candidate(0), probability(probability) {
2525
if (!(probability >= 0 && probability <= 1)) {
2626
throw std::out_of_range("Invalid probability: " + std::to_string(probability));
2727
}
28+
if (0 < probability && probability < 1) {
29+
dist = std::geometric_distribution<size_t>(probability);
30+
}
2831
}
2932

3033
size_t RareErrorIterator::next(std::mt19937_64 &rng) {
31-
size_t result = next_candidate + (is_one ? 0 : dist(rng));
32-
next_candidate = result + 1;
33-
return result;
34+
if (probability == 0) {
35+
return SIZE_MAX;
36+
} else if (probability == 1) {
37+
return next_candidate++;
38+
} else {
39+
size_t result = next_candidate + dist(rng);
40+
next_candidate = result + 1;
41+
return result;
42+
}
3443
}
3544

3645
std::vector<size_t> stim::sample_hit_indices(float probability, size_t attempts, std::mt19937_64 &rng) {

src/stim/util_bot/probability_util.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ constexpr uint64_t INTENTIONAL_VERSION_SEED_INCOMPATIBILITY = 0xDEADBEEF124CULL;
3232
/// Gets more efficient as the hit probability drops.
3333
struct RareErrorIterator {
3434
size_t next_candidate;
35-
bool is_one = false;
35+
float probability;
3636
std::geometric_distribution<size_t> dist;
37+
RareErrorIterator() = delete;
38+
RareErrorIterator(const RareErrorIterator &) = delete;
3739
RareErrorIterator(float probability);
3840
size_t next(std::mt19937_64 &rng);
3941

0 commit comments

Comments
 (0)