-
Notifications
You must be signed in to change notification settings - Fork 13.7k
fix : Dangling pointer for non-empty trigger words in lazy grammar construction #17048
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
marek-hradil
wants to merge
2
commits into
ggml-org:master
Choose a base branch
from
marek-hradil:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+4
−2
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is still a dangling pointer.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Green-Sky Hi, can you provide more info why this is still dangling? (im happy to fix, but im really not knowledgeable in cpp, so id appreciate it greatly)
My reasoning:
ifscopeif, the trigger_patterns is set to a pointer to the trigger_patternllama_grammar_init_impl, everything should still exist finellama-grammar, the patterns are looped through and then accessed and copied with:This way, we make copy for the
ctxobject and can forget the rest.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
trigger_patternslives outside the function, so it will outlive all variables you might declare inside the function. So when we assign it a pointer from something with a lower scope (within the function), the pointer will outlive it.When I looked last, the call stack for that function is somewhat convoluted...
No worries, you can ask anything about cpp. :)
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi, the usage of
const char ** trigger_patternshere is somewhat subtle, but I thinktrigger_patternsappears to be safe :D, because it only modifies a local variable without affecting the passed array (as demonstrated ininit_v1below). However, if implemented likeinit_v2, it would result in a dangling pointer.Perhaps we could use the following implementation approach, which offers better readability and avoids the subtle behavior:
If there are any errors in my code, please correct me. Thank you for the guidance!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@o7si Thanks, you are fully correct. It is not actually a dangling pointer. 👍
Your change proposal reads good. I would not have used a
std::vector<>as a temporary though. Either usestd::array<T, 1>or just a c array (of const char pointers).