Skip to content

Commit 1a29b16

Browse files
committed
fix undefined behavior
1 parent 749d32a commit 1a29b16

6 files changed

Lines changed: 25 additions & 18 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### [1.10.2] - 2022-11-05
44
#### Fixed
55
- `fuzz::partial_ratio` was not always symmetric when `len(s1) == len(s2)`
6+
- fix undefined behavior in experimental SIMD implementaton
67

78
### [1.10.1] - 2022-11-02
89
#### Fixed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
2424
message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
2525
endif()
2626

27-
project(rapidfuzz LANGUAGES CXX VERSION 1.10.1)
27+
project(rapidfuzz LANGUAGES CXX VERSION 1.10.2)
2828

2929
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
3030
include(GNUInstallDirs)

extras/rapidfuzz_amalgamated.hpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
22
// SPDX-License-Identifier: MIT
33
// RapidFuzz v1.0.2
4-
// Generated: 2022-11-19 11:04:42.990794
4+
// Generated: 2022-12-11 00:18:48.007741
55
// ----------------------------------------------------------
66
// This file is an amalgamation of multiple different files.
77
// You probably shouldn't edit it directly.
@@ -7137,14 +7137,15 @@ struct MultiLevenshtein : public detail::MultiDistanceBase<MultiLevenshtein<MaxL
71377137
if (score_count < result_count())
71387138
throw std::invalid_argument("scores has to have >= result_count() elements");
71397139

7140+
detail::Range scores_(scores, scores + score_count);
71407141
if constexpr (MaxLen == 8)
7141-
detail::levenshtein_hyrroe2003_simd<uint8_t>(scores, PM, str_lens, s2, score_cutoff);
7142+
detail::levenshtein_hyrroe2003_simd<uint8_t>(scores_, PM, str_lens, s2, score_cutoff);
71427143
else if constexpr (MaxLen == 16)
7143-
detail::levenshtein_hyrroe2003_simd<uint16_t>(scores, PM, str_lens, s2, score_cutoff);
7144+
detail::levenshtein_hyrroe2003_simd<uint16_t>(scores_, PM, str_lens, s2, score_cutoff);
71447145
else if constexpr (MaxLen == 32)
7145-
detail::levenshtein_hyrroe2003_simd<uint32_t>(scores, PM, str_lens, s2, score_cutoff);
7146+
detail::levenshtein_hyrroe2003_simd<uint32_t>(scores_, PM, str_lens, s2, score_cutoff);
71467147
else if constexpr (MaxLen == 64)
7147-
detail::levenshtein_hyrroe2003_simd<uint64_t>(scores, PM, str_lens, s2, score_cutoff);
7148+
detail::levenshtein_hyrroe2003_simd<uint64_t>(scores_, PM, str_lens, s2, score_cutoff);
71487149
}
71497150

71507151
template <typename InputIt2>
@@ -7698,14 +7699,15 @@ struct MultiOSA
76987699
if (score_count < result_count())
76997700
throw std::invalid_argument("scores has to have >= result_count() elements");
77007701

7702+
detail::Range scores_(scores, scores + score_count);
77017703
if constexpr (MaxLen == 8)
7702-
detail::osa_hyrroe2003_simd<uint8_t>(scores, PM, str_lens, s2, score_cutoff);
7704+
detail::osa_hyrroe2003_simd<uint8_t>(scores_, PM, str_lens, s2, score_cutoff);
77037705
else if constexpr (MaxLen == 16)
7704-
detail::osa_hyrroe2003_simd<uint16_t>(scores, PM, str_lens, s2, score_cutoff);
7706+
detail::osa_hyrroe2003_simd<uint16_t>(scores_, PM, str_lens, s2, score_cutoff);
77057707
else if constexpr (MaxLen == 32)
7706-
detail::osa_hyrroe2003_simd<uint32_t>(scores, PM, str_lens, s2, score_cutoff);
7708+
detail::osa_hyrroe2003_simd<uint32_t>(scores_, PM, str_lens, s2, score_cutoff);
77077709
else if constexpr (MaxLen == 64)
7708-
detail::osa_hyrroe2003_simd<uint64_t>(scores, PM, str_lens, s2, score_cutoff);
7710+
detail::osa_hyrroe2003_simd<uint64_t>(scores_, PM, str_lens, s2, score_cutoff);
77097711
}
77107712

77117713
template <typename InputIt2>
@@ -8126,6 +8128,7 @@ std::basic_string<CharT> opcodes_apply(const Opcodes& ops, const Sentence1& s1,
81268128

81278129
#include <array>
81288130
#include <limits>
8131+
#include <stdint.h>
81298132
#include <stdio.h>
81308133
#include <type_traits>
81318134
#include <unordered_set>

rapidfuzz/details/CharSet.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <array>
66
#include <limits>
77
#include <stdio.h>
8+
#include <stdint.h>
89
#include <type_traits>
910
#include <unordered_set>
1011

rapidfuzz/distance/Levenshtein.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,14 +387,15 @@ struct MultiLevenshtein : public detail::MultiDistanceBase<MultiLevenshtein<MaxL
387387
if (score_count < result_count())
388388
throw std::invalid_argument("scores has to have >= result_count() elements");
389389

390+
detail::Range scores_(scores, scores + score_count);
390391
if constexpr (MaxLen == 8)
391-
detail::levenshtein_hyrroe2003_simd<uint8_t>(scores, PM, str_lens, s2, score_cutoff);
392+
detail::levenshtein_hyrroe2003_simd<uint8_t>(scores_, PM, str_lens, s2, score_cutoff);
392393
else if constexpr (MaxLen == 16)
393-
detail::levenshtein_hyrroe2003_simd<uint16_t>(scores, PM, str_lens, s2, score_cutoff);
394+
detail::levenshtein_hyrroe2003_simd<uint16_t>(scores_, PM, str_lens, s2, score_cutoff);
394395
else if constexpr (MaxLen == 32)
395-
detail::levenshtein_hyrroe2003_simd<uint32_t>(scores, PM, str_lens, s2, score_cutoff);
396+
detail::levenshtein_hyrroe2003_simd<uint32_t>(scores_, PM, str_lens, s2, score_cutoff);
396397
else if constexpr (MaxLen == 64)
397-
detail::levenshtein_hyrroe2003_simd<uint64_t>(scores, PM, str_lens, s2, score_cutoff);
398+
detail::levenshtein_hyrroe2003_simd<uint64_t>(scores_, PM, str_lens, s2, score_cutoff);
398399
}
399400

400401
template <typename InputIt2>

rapidfuzz/distance/OSA.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,15 @@ struct MultiOSA
199199
if (score_count < result_count())
200200
throw std::invalid_argument("scores has to have >= result_count() elements");
201201

202+
detail::Range scores_(scores, scores + score_count);
202203
if constexpr (MaxLen == 8)
203-
detail::osa_hyrroe2003_simd<uint8_t>(scores, PM, str_lens, s2, score_cutoff);
204+
detail::osa_hyrroe2003_simd<uint8_t>(scores_, PM, str_lens, s2, score_cutoff);
204205
else if constexpr (MaxLen == 16)
205-
detail::osa_hyrroe2003_simd<uint16_t>(scores, PM, str_lens, s2, score_cutoff);
206+
detail::osa_hyrroe2003_simd<uint16_t>(scores_, PM, str_lens, s2, score_cutoff);
206207
else if constexpr (MaxLen == 32)
207-
detail::osa_hyrroe2003_simd<uint32_t>(scores, PM, str_lens, s2, score_cutoff);
208+
detail::osa_hyrroe2003_simd<uint32_t>(scores_, PM, str_lens, s2, score_cutoff);
208209
else if constexpr (MaxLen == 64)
209-
detail::osa_hyrroe2003_simd<uint64_t>(scores, PM, str_lens, s2, score_cutoff);
210+
detail::osa_hyrroe2003_simd<uint64_t>(scores_, PM, str_lens, s2, score_cutoff);
210211
}
211212

212213
template <typename InputIt2>

0 commit comments

Comments
 (0)