mirror of
https://github.com/github/codeql.git
synced 2026-03-30 20:28:15 +02:00
123 lines
2.7 KiB
Plaintext
123 lines
2.7 KiB
Plaintext
/**
|
|
* Defines entity discard predicates for C++ overlay analysis.
|
|
*/
|
|
|
|
private import OverlayXml
|
|
|
|
/**
|
|
* 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") }
|
|
|
|
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 with a single location.
|
|
*/
|
|
overlay[local]
|
|
private string getSingleLocationFilePath(@element e) {
|
|
exists(@location_default loc |
|
|
var_decls(e, _, _, _, loc)
|
|
or
|
|
fun_decls(e, _, _, _, loc)
|
|
or
|
|
type_decls(e, _, loc)
|
|
or
|
|
namespace_decls(e, _, loc, _)
|
|
or
|
|
macroinvocations(e, _, loc, _)
|
|
or
|
|
preprocdirects(e, _, loc)
|
|
or
|
|
diagnostics(e, _, _, _, _, loc)
|
|
or
|
|
usings(e, _, loc, _)
|
|
or
|
|
static_asserts(e, _, _, loc, _)
|
|
or
|
|
derivations(e, _, _, _, loc)
|
|
or
|
|
frienddecls(e, _, _, loc)
|
|
or
|
|
comments(e, _, loc)
|
|
or
|
|
exprs(e, _, loc)
|
|
or
|
|
stmts(e, _, loc)
|
|
or
|
|
initialisers(e, _, _, loc)
|
|
or
|
|
attributes(e, _, _, _, loc)
|
|
or
|
|
attribute_args(e, _, _, _, loc)
|
|
or
|
|
namequalifiers(e, _, _, loc)
|
|
or
|
|
enumconstants(e, _, _, _, _, loc)
|
|
or
|
|
type_mentions(e, _, loc, _)
|
|
or
|
|
lambda_capture(e, _, _, _, _, _, loc)
|
|
or
|
|
concept_templates(e, _, loc)
|
|
|
|
|
result = getLocationFilePath(loc)
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Gets the file path for an element with potentially multiple locations.
|
|
*/
|
|
overlay[local]
|
|
private string getMultiLocationFilePath(@element e) {
|
|
exists(@location_default loc |
|
|
var_decls(_, e, _, _, loc)
|
|
or
|
|
fun_decls(_, e, _, _, loc)
|
|
or
|
|
type_decls(_, e, loc)
|
|
or
|
|
namespace_decls(_, e, loc, _)
|
|
|
|
|
result = getLocationFilePath(loc)
|
|
)
|
|
}
|
|
|
|
/**
|
|
* A local helper predicate that holds in the base variant and never in the
|
|
* overlay variant.
|
|
*/
|
|
overlay[local]
|
|
private predicate isBase() { not isOverlay() }
|
|
|
|
/**
|
|
* Holds if `path` was extracted in the overlay database.
|
|
*/
|
|
overlay[local]
|
|
private predicate overlayHasFile(string path) {
|
|
isOverlay() and
|
|
files(_, path) and
|
|
path != ""
|
|
}
|
|
|
|
/**
|
|
* Discards an element from the base variant if:
|
|
* - It has a single location in a file extracted in the overlay, or
|
|
* - All of its locations are in files extracted in the overlay.
|
|
*/
|
|
overlay[discard_entity]
|
|
private predicate discardElement(@element e) {
|
|
isBase() and
|
|
(
|
|
overlayHasFile(getSingleLocationFilePath(e))
|
|
or
|
|
forex(string path | path = getMultiLocationFilePath(e) | overlayHasFile(path))
|
|
)
|
|
}
|