Skip to content

Commit 6cd0cf7

Browse files
authored
fix : Dangling pointer for non-empty trigger words in lazy grammar construction (#17048)
* fix : Dangling pointer for non-empty trigger words in llama_sampler_init_grammar_impl (#17047) * Replace 'static' workaround, with keeping variable in scope for longer * Create std::array directly and pass into llama_grammar_init_impl * Add back the trigger pattern * Missed array include
1 parent d396b43 commit 6cd0cf7

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/llama-sampling.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "llama-vocab.h"
55
#include "llama-grammar.h"
66

7+
#include <array>
78
#include <algorithm>
89
#include <cassert>
910
#include <cfloat>
@@ -1625,10 +1626,12 @@ static struct llama_sampler * llama_sampler_init_grammar_impl(
16251626
auto * ctx = new llama_sampler_grammar;
16261627

16271628
if (grammar_str != nullptr && grammar_str[0] != '\0') {
1629+
std::string trigger_pattern;
1630+
llama_grammar * grammar = nullptr;
16281631
// TODO: remove trigger_words support.
16291632
if (trigger_words != nullptr && num_trigger_words > 0) {
16301633
GGML_ASSERT(trigger_patterns == nullptr && num_trigger_patterns == 0);
1631-
std::string trigger_pattern("[\\s\\S]*?(");
1634+
trigger_pattern = "[\\s\\S]*?(";
16321635
for (size_t i = 0; i < num_trigger_words; ++i) {
16331636
static const std::regex special_chars("[.^$|()*+?\\[\\]{}\\\\]");
16341637
if (i > 0) {
@@ -1637,15 +1640,17 @@ static struct llama_sampler * llama_sampler_init_grammar_impl(
16371640
trigger_pattern += std::regex_replace(trigger_words[i], special_chars, "\\$0");
16381641
}
16391642
trigger_pattern += ")[\\s\\S]*";
1640-
const auto * trigger_pattern_c = trigger_pattern.c_str();
1641-
trigger_patterns = &trigger_pattern_c;
1642-
num_trigger_patterns = 1;
1643+
1644+
std::array<const char *, 1> tmp_trigger_patterns = { trigger_pattern.c_str() };
1645+
grammar = llama_grammar_init_impl(vocab, grammar_str, grammar_root, lazy, tmp_trigger_patterns.data(), tmp_trigger_patterns.size(), trigger_tokens, num_trigger_tokens);
1646+
} else {
1647+
grammar = llama_grammar_init_impl(vocab, grammar_str, grammar_root, lazy, trigger_patterns, num_trigger_patterns, trigger_tokens, num_trigger_tokens);
16431648
}
16441649
*ctx = {
16451650
/* .vocab = */ vocab,
16461651
/* .grammar_str = */ grammar_str,
16471652
/* .grammar_root = */ grammar_root,
1648-
/* .grammar = */ llama_grammar_init_impl(vocab, grammar_str, grammar_root, lazy, trigger_patterns, num_trigger_patterns, trigger_tokens, num_trigger_tokens),
1653+
/* .grammar = */ grammar,
16491654
};
16501655
if (!ctx->grammar) {
16511656
delete ctx;

0 commit comments

Comments
 (0)