Skip to content

Commit b3240f8

Browse files
committed
Fix address and leak sanitizer errors
1 parent dcdb4f6 commit b3240f8

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

include/lug/lug.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -988,8 +988,6 @@ template <class Derived> template <class Handler, class>
988988
template <class RuneSet>
989989
inline decltype(auto) add_rune_range(RuneSet&& runes, directives mode, char32_t first, char32_t last)
990990
{
991-
if (first > last)
992-
throw bad_character_range{};
993991
if ((mode & directives::caseless) != directives::none)
994992
static_cast<unicode::rune_set&>(runes).push_casefolded_range(first, last);
995993
else
@@ -1014,10 +1012,14 @@ struct bracket_expression : terminal_encoder_expression_interface<bracket_expres
10141012
circumflex = true;
10151013
++curr;
10161014
}
1015+
if (curr == last)
1016+
throw bad_character_range{};
10171017
while (curr != last) {
10181018
auto const [next, next_rune] = utf8::decode_rune(curr, last);
1019-
if ((next_rune == U'-') && (next != last) && left_rune.has_value()) {
1019+
if ((next_rune == U'-') && (next != last)) {
10201020
auto const [right, right_rune] = utf8::decode_rune(next, last);
1021+
if (!left_rune.has_value())
1022+
throw bad_character_range{};
10211023
add_rune_range(std::ref(result), mode, *left_rune, right_rune);
10221024
left_rune = std::nullopt;
10231025
curr = right;
@@ -3094,8 +3096,7 @@ class basic_parser : public parser_base
30943096
template <class InputRng, class = detail::enable_if_char_input_range_t<InputRng>>
30953097
basic_parser& enqueue(InputRng&& rng) // NOLINT(cppcoreguidelines-missing-std-forward)
30963098
{
3097-
enqueue(rng.begin(), rng.end());
3098-
return *this;
3099+
return enqueue(rng.begin(), rng.end());
30993100
}
31003101

31013102
template <class InputFunc, class = std::enable_if_t<detail::input_source_has_push_source<InputSource, InputFunc&&>::value>>

samples/basic/basic.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ class basic_interpreter
417417
double& param_var = vars_[param];
418418
double const saved_var = param_var;
419419
param_var = arg;
420-
bool const success = lug::parser{grammar_, environment_}.parse(body);
420+
bool const success = lug::parse(body, grammar_, environment_);
421421
environment_.set_condition("fnev", saved_fn_eval);
422422
environment_.should_reset_on_parse(true);
423423
param_var = saved_var;

samples/calc/calc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ extern rule Expr;
2020

2121
rule BLANK = noskip[ *" \t"_bx ];
2222
rule ID = lexeme[ "a-zA-Z"_bx <[](syntax m) -> int { return std::tolower(m.str().at(0)) - 'a'; } ];
23-
rule NUMBER = lexeme[ ( ~"-+"_bx > +"0-9"_bx > ~('.' > +"0-9"_bx) )
23+
rule NUMBER = lexeme[ ( ~"+-"_bx > +"0-9"_bx > ~('.' > +"0-9"_bx) )
2424
<[](syntax m) -> double { return std::stod(std::string{m}); } ];
2525
rule Value = n%NUMBER <[]{ return n; }
2626
| i%ID > !"="_sx <[]{ return v[i]; }

0 commit comments

Comments
 (0)