mirror of
https://github.com/github/codeql.git
synced 2026-01-30 06:42:57 +01:00
Explicitly walk pointer types
In a previous draft these could use getBaseType*
This commit is contained in:
committed by
Owen Mansel-Chan
parent
660ba4e31c
commit
9a427931b7
@@ -379,7 +379,10 @@ class StructType extends @structtype, CompositeType {
|
||||
* hasEmbeddedField holds if there is an embedded field at int `depth`, with either type `tp` or `tp`'s pointer type.
|
||||
*/
|
||||
private predicate hasEmbeddedField(Type tp, int depth) {
|
||||
exists(Field f | this.hasFieldCand(_, f, depth, true) | tp = f.getType().getBaseType*())
|
||||
exists(Field f | this.hasFieldCand(_, f, depth, true) |
|
||||
tp = f.getType() or
|
||||
tp = f.getType().(PointerType).getBaseType()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -389,8 +392,10 @@ class StructType extends @structtype, CompositeType {
|
||||
// embeddedParent is a field of 'this' at depth 'depth - 1'
|
||||
this.hasFieldCand(_, embeddedParent, depth - 1, true) and
|
||||
// embeddedParent's type has the result field
|
||||
exists(StructType embeddedType |
|
||||
embeddedType = embeddedParent.getType().getBaseType*().getUnderlyingType()
|
||||
exists(StructType embeddedType, Type fieldType |
|
||||
fieldType = embeddedParent.getType().getUnderlyingType() and
|
||||
pragma[only_bind_into](embeddedType) =
|
||||
[fieldType, fieldType.(PointerType).getBaseType().getUnderlyingType()]
|
||||
|
|
||||
result = embeddedType.getOwnField(name, isEmbedded)
|
||||
)
|
||||
|
||||
@@ -48,8 +48,11 @@ private predicate isCond(Expr e) {
|
||||
e = any(ParenExpr par | isCond(par)).getExpr()
|
||||
}
|
||||
|
||||
private Type getSelectedStructType(PromotedFieldSelector e) {
|
||||
pragma[only_bind_into](result) = e.getBase().getType().getBaseType*().getUnderlyingType()
|
||||
private StructType getSelectedStructType(PromotedFieldSelector e) {
|
||||
exists(Type baseType | baseType = e.getBase().getType().getUnderlyingType() |
|
||||
pragma[only_bind_into](result) =
|
||||
[baseType, baseType.(PointerType).getBaseType().getUnderlyingType()]
|
||||
)
|
||||
}
|
||||
|
||||
private predicate implicitFieldSelection(PromotedFieldSelector e, int i, Field implicitField) {
|
||||
|
||||
@@ -279,8 +279,11 @@ module IR {
|
||||
PromotedFieldSelector() { this.refersTo(any(PromotedField f)) }
|
||||
}
|
||||
|
||||
private Type getSelectedStructType(PromotedFieldSelector e) {
|
||||
pragma[only_bind_into](result) = e.getBase().getType().getBaseType*().getUnderlyingType()
|
||||
private StructType getSelectedStructType(PromotedFieldSelector e) {
|
||||
exists(Type baseType | baseType = e.getBase().getType().getUnderlyingType() |
|
||||
pragma[only_bind_into](result) =
|
||||
[baseType, baseType.(PointerType).getBaseType().getUnderlyingType()]
|
||||
)
|
||||
}
|
||||
|
||||
private Instruction promotedFieldSelectorBase(PromotedFieldSelector se, Field field) {
|
||||
|
||||
Reference in New Issue
Block a user