11import ql
2+ private import Builtins
23private import codeql_ql.ast.internal.Module
34
45private predicate definesPredicate ( FileOrModule m , string name , ClasslessPredicate p , boolean public ) {
@@ -38,7 +39,7 @@ predicate resolvePredicateExpr(PredicateExpr pe, ClasslessPredicate p) {
3839 )
3940}
4041
41- private predicate resolvePredicateCall ( PredicateCall pc , Predicate p ) {
42+ private predicate resolvePredicateCall ( PredicateCall pc , PredicateOrBuiltin p ) {
4243 exists ( Class c , ClassType t |
4344 c = pc .getParent * ( ) and
4445 t = c .getType ( ) and
@@ -53,24 +54,125 @@ private predicate resolvePredicateCall(PredicateCall pc, Predicate p) {
5354 m = pc .getQualifier ( ) .getResolvedModule ( ) and
5455 public = true
5556 |
56- definesPredicate ( m , pc .getPredicateName ( ) , p , public ) and
57- count ( p . getParameter ( _ ) ) = pc .getNumberOfArguments ( )
57+ definesPredicate ( m , pc .getPredicateName ( ) , p . getDeclaration ( ) , public ) and
58+ p . getArity ( ) = pc .getNumberOfArguments ( )
5859 )
5960}
6061
61- private predicate resolveMemberCall ( MemberCall mc , Predicate p ) {
62- exists ( ClassType t |
62+ private predicate resolveMemberCall ( MemberCall mc , PredicateOrBuiltin p ) {
63+ exists ( Type t |
6364 t = mc .getBase ( ) .getType ( ) and
6465 p = t .getClassPredicate ( mc .getMemberName ( ) , mc .getNumberOfArguments ( ) )
6566 )
6667}
6768
68- predicate resolveCall ( Call c , Predicate p ) {
69+ predicate resolveCall ( Call c , PredicateOrBuiltin p ) {
6970 resolvePredicateCall ( c , p )
7071 or
7172 resolveMemberCall ( c , p )
7273}
7374
75+ private newtype TPredOrBuiltin =
76+ TPred ( Predicate p ) or
77+ TBuiltinClassless ( string ret , string name , string args ) { isBuiltinClassless ( ret , name , args ) } or
78+ TBuiltinMember ( string qual , string ret , string name , string args ) {
79+ isBuiltinMember ( qual , ret , name , args )
80+ }
81+
82+ class PredicateOrBuiltin extends TPredOrBuiltin {
83+ string getName ( ) { none ( ) }
84+
85+ string toString ( ) { result = getName ( ) }
86+
87+ predicate hasLocationInfo (
88+ string filepath , int startline , int startcolumn , int endline , int endcolumn
89+ ) {
90+ if exists ( getDeclaration ( ) )
91+ then
92+ getDeclaration ( )
93+ .getLocation ( )
94+ .hasLocationInfo ( filepath , startline , startcolumn , endline , endcolumn )
95+ else (
96+ filepath = "" and
97+ startline = 0 and
98+ startcolumn = 0 and
99+ endline = 0 and
100+ endcolumn = 0
101+ )
102+ }
103+
104+ Predicate getDeclaration ( ) { none ( ) }
105+
106+ Type getDeclaringType ( ) { none ( ) }
107+
108+ Type getParameterType ( int i ) { none ( ) }
109+
110+ Type getReturnType ( ) { none ( ) }
111+
112+ int getArity ( ) { result = count ( getParameterType ( _) ) }
113+
114+ predicate isPrivate ( ) { none ( ) }
115+ }
116+
117+ private class DefinedPredicate extends PredicateOrBuiltin , TPred {
118+ Predicate decl ;
119+
120+ DefinedPredicate ( ) { this = TPred ( decl ) }
121+
122+ override Predicate getDeclaration ( ) { result = decl }
123+
124+ override string getName ( ) { result = decl .getName ( ) }
125+
126+ override Type getReturnType ( ) { result = decl .getReturnType ( ) }
127+
128+ override Type getParameterType ( int i ) { result = decl .getParameter ( i ) .getType ( ) }
129+
130+ override Type getDeclaringType ( ) {
131+ result = decl .( ClassPredicate ) .getDeclaringType ( )
132+ or
133+ result = decl .( CharPred ) .getDeclaringType ( )
134+ }
135+
136+ override predicate isPrivate ( ) {
137+ decl .( ClassPredicate ) .isPrivate ( ) or decl .( ClassPredicate ) .isPrivate ( )
138+ }
139+ }
140+
141+ private class TBuiltin = TBuiltinClassless or TBuiltinMember ;
142+
143+ class BuiltinPredicate extends PredicateOrBuiltin , TBuiltin { }
144+
145+ private class BuiltinClassless extends BuiltinPredicate , TBuiltinClassless {
146+ string name ;
147+ string ret ;
148+ string args ;
149+
150+ BuiltinClassless ( ) { this = TBuiltinClassless ( ret , name , args ) }
151+
152+ override string getName ( ) { result = name }
153+
154+ override PrimitiveType getReturnType ( ) { result .getName ( ) = ret }
155+
156+ override PrimitiveType getParameterType ( int i ) { result .getName ( ) = getArgType ( args , i ) }
157+ }
158+
159+ private class BuiltinMember extends BuiltinPredicate , TBuiltinMember {
160+ string name ;
161+ string qual ;
162+ string ret ;
163+ string args ;
164+
165+ BuiltinMember ( ) { this = TBuiltinMember ( qual , ret , name , args ) }
166+
167+ override string getName ( ) { result = name }
168+
169+ override PrimitiveType getReturnType ( ) { result .getName ( ) = ret }
170+
171+ override PrimitiveType getParameterType ( int i ) { result .getName ( ) = getArgType ( args , i ) }
172+
173+ override PrimitiveType getDeclaringType ( ) { result .getName ( ) = qual }
174+ }
175+
74176module PredConsistency {
75177 query predicate noResolvePredicateExpr ( PredicateExpr pe ) {
76178 not resolvePredicateExpr ( pe , _) and
@@ -88,8 +190,8 @@ module PredConsistency {
88190 resolvePredicateExpr ( pe , p )
89191 }
90192
91- query predicate multipleResolveCall ( Call call , int c , Predicate p ) {
92- c = strictcount ( Predicate p0 | resolveCall ( call , p0 ) ) and
193+ query predicate multipleResolveCall ( Call call , int c , PredicateOrBuiltin p ) {
194+ c = strictcount ( PredicateOrBuiltin p0 | resolveCall ( call , p0 ) ) and
93195 c > 1 and
94196 resolveCall ( call , p )
95197 }
0 commit comments