mirror of
https://github.com/github/codeql.git
synced 2025-12-16 08:43:11 +01:00
C/C++ overlay: Add basic Overlay.qll file
This commit is contained in:
@@ -74,3 +74,4 @@ import semmle.code.cpp.Preprocessor
|
||||
import semmle.code.cpp.Iteration
|
||||
import semmle.code.cpp.NameQualifiers
|
||||
import DefaultOptions
|
||||
private import semmle.code.cpp.internal.Overlay
|
||||
|
||||
40
cpp/ql/lib/semmle/code/cpp/internal/Overlay.qll
Normal file
40
cpp/ql/lib/semmle/code/cpp/internal/Overlay.qll
Normal file
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Defines entity discard predicates for C++ overlay analysis.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Holds always for the overlay variant and never for the base variant.
|
||||
* This local predicate is used to define local predicates that behave
|
||||
* differently for the base and overlay variant.
|
||||
*/
|
||||
overlay[local]
|
||||
predicate isOverlay() { databaseMetadata("isOverlay", "true") }
|
||||
|
||||
/** Gets the file path for a location. */
|
||||
overlay[local]
|
||||
private string getLocationFilePath(@location_default loc) {
|
||||
exists(@file file | locations_default(loc, file, _, _, _, _) | files(file, result))
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the file path for an element in the base variant.
|
||||
*/
|
||||
overlay[local]
|
||||
private string getElementPathInBase(@element e) {
|
||||
not isOverlay() and
|
||||
exists(@location_default loc |
|
||||
// Direct location (declarations)
|
||||
var_decls(e, _, _, _, loc)
|
||||
or
|
||||
// Indirect location (entities)
|
||||
exists(@var_decl vd | var_decls(vd, e, _, _, _) | var_decls(vd, _, _, _, loc))
|
||||
|
|
||||
result = getLocationFilePath(loc)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Discard any element from the base that is in a changed file.
|
||||
*/
|
||||
overlay[discard_entity]
|
||||
private predicate discardElement(@element e) { overlayChangedFiles(getElementPathInBase(e)) }
|
||||
Reference in New Issue
Block a user