-
Notifications
You must be signed in to change notification settings - Fork 1.7k
C++: Ensure that only one Function
exists for every function
#12125
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
Merged
Merged
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
--- | ||
category: fix | ||
--- | ||
* Under certain circumstances a function declaration that is not also a definition could be associated with a `Function` that did not have the definition as a `FunctionDeclarationEntry`. This is now fixed when only one definition exists, and a unique `Function` will exist that has both the declaration and the definition as a `FunctionDeclarationEntry`. |
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
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
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
private predicate hasDefinition(@function f) { | ||
exists(@fun_decl fd | fun_decls(fd, f, _, _, _) | fun_def(fd)) | ||
} | ||
|
||
private predicate onlyOneCompleteFunctionExistsWithMangledName(@mangledname name) { | ||
strictcount(@function f | hasDefinition(f) and mangled_name(f, name)) = 1 | ||
} | ||
|
||
/** Holds if `f` is a unique function with a definition named `name`. */ | ||
private predicate isFunctionWithMangledNameAndWithDefinition(@mangledname name, @function f) { | ||
hasDefinition(f) and | ||
mangled_name(f, name) and | ||
onlyOneCompleteFunctionExistsWithMangledName(name) | ||
} | ||
|
||
/** Holds if `f` is a function without a definition named `name`. */ | ||
private predicate isFunctionWithMangledNameAndWithoutDefinition(@mangledname name, @function f) { | ||
not hasDefinition(f) and | ||
mangled_name(f, name) | ||
} | ||
|
||
/** | ||
* Holds if `incomplete` is a function without a definition, and there exists | ||
* a unique function `complete` with the same name that does have a definition. | ||
*/ | ||
private predicate hasTwinWithDefinition(@function incomplete, @function complete) { | ||
not function_instantiation(incomplete, complete) and | ||
( | ||
not compgenerated(incomplete) or | ||
not compgenerated(complete) | ||
) and | ||
exists(@mangledname name | | ||
isFunctionWithMangledNameAndWithoutDefinition(name, incomplete) and | ||
isFunctionWithMangledNameAndWithDefinition(name, complete) | ||
) | ||
} | ||
|
||
import Cached | ||
|
||
cached | ||
private module Cached { | ||
/** | ||
* If `f` is a function without a definition, and there exists a unique | ||
* function with the same name that does have a definition, then the | ||
* result is that unique function. Otherwise, the result is `f`. | ||
*/ | ||
cached | ||
@function resolveFunction(@function f) { | ||
hasTwinWithDefinition(f, result) | ||
or | ||
not hasTwinWithDefinition(f, _) and | ||
result = f | ||
} | ||
|
||
cached | ||
predicate isFunction(@function f) { f = resolveFunction(_) } | ||
} |
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
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.
Uh oh!
There was an error while loading. Please reload this page.