From 0cc7c8ad265d1989fe48bc1980fed4979a094ec7 Mon Sep 17 00:00:00 2001 From: Marek Hradil jr Date: Thu, 6 Nov 2025 11:19:41 +0100 Subject: [PATCH 1/2] fix : Dangling pointer for non-empty trigger words in llama_sampler_init_grammar_impl (#17047) --- src/llama-sampling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llama-sampling.cpp b/src/llama-sampling.cpp index 55d2e355fd8bb..b71a6f340059d 100644 --- a/src/llama-sampling.cpp +++ b/src/llama-sampling.cpp @@ -1637,7 +1637,7 @@ static struct llama_sampler * llama_sampler_init_grammar_impl( trigger_pattern += std::regex_replace(trigger_words[i], special_chars, "\\$0"); } trigger_pattern += ")[\\s\\S]*"; - const auto * trigger_pattern_c = trigger_pattern.c_str(); + static const auto * trigger_pattern_c = trigger_pattern.c_str(); trigger_patterns = &trigger_pattern_c; num_trigger_patterns = 1; } From f846c83ffbfca1a0d27c2ea7db5bf5997963dacc Mon Sep 17 00:00:00 2001 From: Marek Hradil jr Date: Thu, 6 Nov 2025 13:56:31 +0100 Subject: [PATCH 2/2] Replace 'static' workaround, with keeping variable in scope for longer --- src/llama-sampling.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/llama-sampling.cpp b/src/llama-sampling.cpp index b71a6f340059d..d1c30c0777d99 100644 --- a/src/llama-sampling.cpp +++ b/src/llama-sampling.cpp @@ -1625,10 +1625,12 @@ static struct llama_sampler * llama_sampler_init_grammar_impl( auto * ctx = new llama_sampler_grammar; if (grammar_str != nullptr && grammar_str[0] != '\0') { + std::string trigger_pattern; + const char * trigger_pattern_c = nullptr; // TODO: remove trigger_words support. if (trigger_words != nullptr && num_trigger_words > 0) { GGML_ASSERT(trigger_patterns == nullptr && num_trigger_patterns == 0); - std::string trigger_pattern("[\\s\\S]*?("); + trigger_pattern = "[\\s\\S]*?("; for (size_t i = 0; i < num_trigger_words; ++i) { static const std::regex special_chars("[.^$|()*+?\\[\\]{}\\\\]"); if (i > 0) { @@ -1637,7 +1639,7 @@ static struct llama_sampler * llama_sampler_init_grammar_impl( trigger_pattern += std::regex_replace(trigger_words[i], special_chars, "\\$0"); } trigger_pattern += ")[\\s\\S]*"; - static const auto * trigger_pattern_c = trigger_pattern.c_str(); + trigger_pattern_c = trigger_pattern.c_str(); trigger_patterns = &trigger_pattern_c; num_trigger_patterns = 1; }