mirror of
https://github.com/github/codeql.git
synced 2026-04-30 19:26:02 +02:00
add JS support for static initializers
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
class MyClass {
|
||||
static x = 1;
|
||||
constructor() {
|
||||
this.y = 2;
|
||||
}
|
||||
static {
|
||||
MyClass.z = 3;
|
||||
}
|
||||
foo() {
|
||||
this.t = 4;
|
||||
}
|
||||
static bar() {
|
||||
this.u = 5;
|
||||
}
|
||||
static {
|
||||
this.v = 6;
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ test_FieldInits
|
||||
| privateFields.js:2:2:2:15 | #privDecl = 3; | privateFields.js:2:14:2:14 | 3 |
|
||||
| privateFields.js:3:2:3:12 | #if = "if"; | privateFields.js:3:8:3:11 | "if" |
|
||||
| privateFields.js:21:2:21:22 | ["#publ ... "] = 6; | privateFields.js:21:21:21:21 | 6 |
|
||||
| staticInitializer.js:2:3:2:15 | static x = 1; | staticInitializer.js:2:14:2:14 | 1 |
|
||||
test_ComputedMethods
|
||||
| tst.js:3:3:3:56 | ["const ... r. */ } |
|
||||
| tst.js:13:3:13:10 | [m]() {} |
|
||||
@@ -11,6 +12,7 @@ test_StaticMethods
|
||||
| points.js:15:3:17:3 | static ... t";\\n } |
|
||||
| points.js:30:3:32:3 | static ... t";\\n } |
|
||||
| staticConstructor.js:2:3:2:59 | static ... tor"; } |
|
||||
| staticInitializer.js:12:3:14:3 | static ... 5;\\n } |
|
||||
test_ClassDefinition_getSuperClass
|
||||
| points.js:20:1:33:1 | class C ... ;\\n }\\n} | points.js:20:29:20:33 | Point |
|
||||
| tst.js:6:1:8:1 | class B ... t); }\\n} | tst.js:6:17:6:17 | A |
|
||||
@@ -18,6 +20,7 @@ test_ClassNodeStaticMethod
|
||||
| points.js:1:1:18:1 | class P ... ;\\n }\\n} | className | points.js:15:19:17:3 | () {\\n ... t";\\n } |
|
||||
| points.js:20:1:33:1 | class C ... ;\\n }\\n} | className | points.js:30:19:32:3 | () {\\n ... t";\\n } |
|
||||
| staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} | constructor | staticConstructor.js:2:21:2:59 | () { re ... tor"; } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | bar | staticInitializer.js:12:13:14:3 | () {\\n ... 5;\\n } |
|
||||
test_ClassDefinitions
|
||||
| dataflow.js:4:2:13:2 | class F ... \\n\\t\\t}\\n\\t} |
|
||||
| fields.js:1:1:4:1 | class C ... = 42\\n} |
|
||||
@@ -25,6 +28,7 @@ test_ClassDefinitions
|
||||
| points.js:20:1:33:1 | class C ... ;\\n }\\n} |
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} |
|
||||
| staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} |
|
||||
| tst.js:1:9:4:1 | class { ... */ }\\n} |
|
||||
| tst.js:6:1:8:1 | class B ... t); }\\n} |
|
||||
| tst.js:11:1:14:1 | class C ... () {}\\n} |
|
||||
@@ -38,6 +42,7 @@ test_Fields
|
||||
| privateFields.js:3:2:3:12 | #if = "if"; | privateFields.js:3:2:3:4 | #if |
|
||||
| privateFields.js:19:2:19:13 | #privSecond; | privateFields.js:19:2:19:12 | #privSecond |
|
||||
| privateFields.js:21:2:21:22 | ["#publ ... "] = 6; | privateFields.js:21:3:21:16 | "#publicField" |
|
||||
| staticInitializer.js:2:3:2:15 | static x = 1; | staticInitializer.js:2:10:2:10 | x |
|
||||
test_ClassDefinition_getName
|
||||
| dataflow.js:4:2:13:2 | class F ... \\n\\t\\t}\\n\\t} | Foo |
|
||||
| fields.js:1:1:4:1 | class C ... = 42\\n} | C |
|
||||
@@ -45,6 +50,7 @@ test_ClassDefinition_getName
|
||||
| points.js:20:1:33:1 | class C ... ;\\n }\\n} | ColouredPoint |
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} | Foo |
|
||||
| staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} | MyClass |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | MyClass |
|
||||
| tst.js:1:9:4:1 | class { ... */ }\\n} | A |
|
||||
| tst.js:6:1:8:1 | class B ... t); }\\n} | B |
|
||||
| tst.js:11:1:14:1 | class C ... () {}\\n} | C |
|
||||
@@ -67,6 +73,9 @@ test_MethodDefinitions
|
||||
| privateFields.js:23:2:26:2 | calls() ... l();\\n\\t} | privateFields.js:23:2:23:6 | calls | privateFields.js:23:7:26:2 | () {\\n\\t\\t ... l();\\n\\t} | privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} |
|
||||
| staticConstructor.js:1:15:1:14 | constructor() {} | staticConstructor.js:1:15:1:14 | constructor | staticConstructor.js:1:15:1:14 | () {} | staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} |
|
||||
| staticConstructor.js:2:3:2:59 | static ... tor"; } | staticConstructor.js:2:10:2:20 | constructor | staticConstructor.js:2:21:2:59 | () { re ... tor"; } | staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} |
|
||||
| staticInitializer.js:3:3:5:3 | constru ... 2;\\n } | staticInitializer.js:3:3:3:13 | constructor | staticInitializer.js:3:14:5:3 | () {\\n ... 2;\\n } | staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} |
|
||||
| staticInitializer.js:9:3:11:3 | foo() { ... 4;\\n } | staticInitializer.js:9:3:9:5 | foo | staticInitializer.js:9:6:11:3 | () {\\n ... 4;\\n } | staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} |
|
||||
| staticInitializer.js:12:3:14:3 | static ... 5;\\n } | staticInitializer.js:12:10:12:12 | bar | staticInitializer.js:12:13:14:3 | () {\\n ... 5;\\n } | staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} |
|
||||
| tst.js:2:3:2:50 | "constr ... r. */ } | tst.js:2:3:2:15 | "constructor" | tst.js:2:16:2:50 | () { /* ... r. */ } | tst.js:1:9:4:1 | class { ... */ }\\n} |
|
||||
| tst.js:3:3:3:56 | ["const ... r. */ } | tst.js:3:4:3:16 | "constructor" | tst.js:3:18:3:56 | () { /* ... r. */ } | tst.js:1:9:4:1 | class { ... */ }\\n} |
|
||||
| tst.js:7:3:7:38 | constru ... get); } | tst.js:7:3:7:13 | constructor | tst.js:7:14:7:38 | () { su ... get); } | tst.js:6:1:8:1 | class B ... t); }\\n} |
|
||||
@@ -99,6 +108,12 @@ test_getAMember
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} | privateFields.js:23:2:26:2 | calls() ... l();\\n\\t} |
|
||||
| staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} | staticConstructor.js:1:15:1:14 | constructor() {} |
|
||||
| staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} | staticConstructor.js:2:3:2:59 | static ... tor"; } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:2:3:2:15 | static x = 1; |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:3:3:5:3 | constru ... 2;\\n } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:6:10:8:3 | {\\n M ... 3;\\n } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:9:3:11:3 | foo() { ... 4;\\n } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:12:3:14:3 | static ... 5;\\n } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:15:10:17:3 | {\\n t ... 6;\\n } |
|
||||
| tst.js:1:9:4:1 | class { ... */ }\\n} | tst.js:2:3:2:50 | "constr ... r. */ } |
|
||||
| tst.js:1:9:4:1 | class { ... */ }\\n} | tst.js:3:3:3:56 | ["const ... r. */ } |
|
||||
| tst.js:6:1:8:1 | class B ... t); }\\n} | tst.js:7:3:7:38 | constru ... get); } |
|
||||
@@ -124,6 +139,9 @@ test_MethodNames
|
||||
| privateFields.js:23:2:26:2 | calls() ... l();\\n\\t} | calls |
|
||||
| staticConstructor.js:1:15:1:14 | constructor() {} | constructor |
|
||||
| staticConstructor.js:2:3:2:59 | static ... tor"; } | constructor |
|
||||
| staticInitializer.js:3:3:5:3 | constru ... 2;\\n } | constructor |
|
||||
| staticInitializer.js:9:3:11:3 | foo() { ... 4;\\n } | foo |
|
||||
| staticInitializer.js:12:3:14:3 | static ... 5;\\n } | bar |
|
||||
| tst.js:2:3:2:50 | "constr ... r. */ } | constructor |
|
||||
| tst.js:3:3:3:56 | ["const ... r. */ } | constructor |
|
||||
| tst.js:7:3:7:38 | constru ... get); } | constructor |
|
||||
@@ -148,6 +166,7 @@ test_ConstructorDefinitions
|
||||
| points.js:21:3:24:3 | constru ... c;\\n } |
|
||||
| privateFields.js:1:11:1:10 | constructor() {} |
|
||||
| staticConstructor.js:1:15:1:14 | constructor() {} |
|
||||
| staticInitializer.js:3:3:5:3 | constru ... 2;\\n } |
|
||||
| tst.js:2:3:2:50 | "constr ... r. */ } |
|
||||
| tst.js:7:3:7:38 | constru ... get); } |
|
||||
| tst.js:11:9:11:8 | constructor() {} |
|
||||
@@ -158,6 +177,7 @@ test_ClassNodeConstructor
|
||||
| points.js:20:1:33:1 | class C ... ;\\n }\\n} | points.js:21:14:24:3 | (x, y, ... c;\\n } |
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} | privateFields.js:1:11:1:10 | () {} |
|
||||
| staticConstructor.js:1:1:3:1 | class M ... r"; }\\n} | staticConstructor.js:1:15:1:14 | () {} |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:3:14:5:3 | () {\\n ... 2;\\n } |
|
||||
| tst.js:1:9:4:1 | class { ... */ }\\n} | tst.js:2:16:2:50 | () { /* ... r. */ } |
|
||||
| tst.js:6:1:8:1 | class B ... t); }\\n} | tst.js:7:14:7:38 | () { su ... get); } |
|
||||
| tst.js:11:1:14:1 | class C ... () {}\\n} | tst.js:11:9:11:8 | () {} |
|
||||
@@ -170,6 +190,7 @@ test_ClassNodeInstanceMethod
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} | equals | privateFields.js:10:8:12:2 | (o) {\\n\\t ... ecl;\\n\\t} |
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} | reads | privateFields.js:4:7:8:2 | () {\\n\\t\\t ... #if;\\n\\t} |
|
||||
| privateFields.js:1:1:27:1 | class F ... );\\n\\t}\\n} | writes | privateFields.js:14:8:17:2 | () {\\n\\t\\t ... = 5;\\n\\t} |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | foo | staticInitializer.js:9:6:11:3 | () {\\n ... 4;\\n } |
|
||||
| tst.js:1:9:4:1 | class { ... */ }\\n} | constructor | tst.js:3:18:3:56 | () { /* ... r. */ } |
|
||||
| tst.js:11:1:14:1 | class C ... () {}\\n} | m | tst.js:12:4:12:8 | () {} |
|
||||
getAccessModifier
|
||||
@@ -223,6 +244,15 @@ getAccessModifier
|
||||
| staticConstructor.js:2:3:2:59 | static ... tor"; } | staticConstructor.js:2:10:2:20 | constructor | Public |
|
||||
| staticConstructor.js:4:1:4:11 | console.log | staticConstructor.js:4:9:4:11 | log | Public |
|
||||
| staticConstructor.js:4:13:4:31 | MyClass.constructor | staticConstructor.js:4:21:4:31 | constructor | Public |
|
||||
| staticInitializer.js:2:3:2:15 | static x = 1; | staticInitializer.js:2:10:2:10 | x | Public |
|
||||
| staticInitializer.js:3:3:5:3 | constru ... 2;\\n } | staticInitializer.js:3:3:3:13 | constructor | Public |
|
||||
| staticInitializer.js:4:5:4:10 | this.y | staticInitializer.js:4:10:4:10 | y | Public |
|
||||
| staticInitializer.js:7:5:7:13 | MyClass.z | staticInitializer.js:7:13:7:13 | z | Public |
|
||||
| staticInitializer.js:9:3:11:3 | foo() { ... 4;\\n } | staticInitializer.js:9:3:9:5 | foo | Public |
|
||||
| staticInitializer.js:10:5:10:10 | this.t | staticInitializer.js:10:10:10:10 | t | Public |
|
||||
| staticInitializer.js:12:3:14:3 | static ... 5;\\n } | staticInitializer.js:12:10:12:12 | bar | Public |
|
||||
| staticInitializer.js:13:5:13:10 | this.u | staticInitializer.js:13:10:13:10 | u | Public |
|
||||
| staticInitializer.js:16:5:16:10 | this.v | staticInitializer.js:16:10:16:10 | v | Public |
|
||||
| tst.js:2:3:2:50 | "constr ... r. */ } | tst.js:2:3:2:15 | "constructor" | Public |
|
||||
| tst.js:3:3:3:56 | ["const ... r. */ } | tst.js:3:4:3:16 | "constructor" | Public |
|
||||
| tst.js:7:3:7:38 | constru ... get); } | tst.js:7:3:7:13 | constructor | Public |
|
||||
@@ -233,3 +263,6 @@ getAccessModifier
|
||||
dataflow
|
||||
| dataflow.js:2:15:2:22 | "source" | dataflow.js:14:7:14:25 | new Foo().getPriv() |
|
||||
| dataflow.js:2:15:2:22 | "source" | dataflow.js:16:7:16:33 | new Foo ... ivate() |
|
||||
staticInitializer
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:6:10:8:3 | {\\n M ... 3;\\n } |
|
||||
| staticInitializer.js:1:1:18:1 | class M ... ;\\n }\\n} | staticInitializer.js:15:10:17:3 | {\\n t ... 6;\\n } |
|
||||
|
||||
@@ -1,20 +1,76 @@
|
||||
import FieldInits
|
||||
import ComputedMethods
|
||||
import StaticMethods
|
||||
import ClassDefinition_getSuperClass
|
||||
import ClassNodeStaticMethod
|
||||
import ClassDefinitions
|
||||
import AccessorMethods
|
||||
import Fields
|
||||
import ClassDefinition_getName
|
||||
import MethodDefinitions
|
||||
import getAMember
|
||||
import MethodNames
|
||||
import NewTargetExpr
|
||||
import SuperExpr
|
||||
import SyntheticConstructors
|
||||
import ConstructorDefinitions
|
||||
import ClassNodeConstructor
|
||||
import ClassNodeInstanceMethod
|
||||
import PrivateField
|
||||
import ClassFlow
|
||||
import javascript
|
||||
|
||||
query predicate test_FieldInits(FieldDefinition field, Expr res) { res = field.getInit() }
|
||||
|
||||
query predicate test_ComputedMethods(MethodDefinition md) { md.isComputed() }
|
||||
|
||||
query predicate test_StaticMethods(MethodDefinition md) { md.isStatic() }
|
||||
|
||||
query predicate test_ClassDefinition_getSuperClass(ClassDefinition cd, Expr res) {
|
||||
res = cd.getSuperClass()
|
||||
}
|
||||
|
||||
query predicate test_ClassNodeStaticMethod(
|
||||
DataFlow::ClassNode class_, string name, DataFlow::FunctionNode res
|
||||
) {
|
||||
res = class_.getStaticMethod(name)
|
||||
}
|
||||
|
||||
query predicate test_ClassDefinitions(ClassDefinition cd) { any() }
|
||||
|
||||
query predicate test_AccessorMethods(AccessorMethodDefinition amd) { any() }
|
||||
|
||||
query predicate test_Fields(FieldDefinition field, Expr res) { res = field.getNameExpr() }
|
||||
|
||||
query predicate test_ClassDefinition_getName(ClassDefinition cd, string res) { res = cd.getName() }
|
||||
|
||||
query predicate test_MethodDefinitions(
|
||||
MethodDefinition md, Expr res0, FunctionExpr res1, ClassDefinition res2
|
||||
) {
|
||||
res0 = md.getNameExpr() and res1 = md.getBody() and res2 = md.getDeclaringClass()
|
||||
}
|
||||
|
||||
query predicate test_getAMember(ClassDefinition c, MemberDeclaration res) { res = c.getAMember() }
|
||||
|
||||
query predicate test_MethodNames(MethodDefinition md, string res) { res = md.getName() }
|
||||
|
||||
query predicate test_NewTargetExpr(NewTargetExpr e) { any() }
|
||||
|
||||
query predicate test_SuperExpr(SuperExpr s) { any() }
|
||||
|
||||
query predicate test_SyntheticConstructors(ConstructorDefinition cd) { cd.isSynthetic() }
|
||||
|
||||
query predicate test_ConstructorDefinitions(ConstructorDefinition cd) { any() }
|
||||
|
||||
query predicate test_ClassNodeConstructor(DataFlow::ClassNode class_, DataFlow::FunctionNode res) {
|
||||
res = class_.getConstructor()
|
||||
}
|
||||
|
||||
query predicate test_ClassNodeInstanceMethod(
|
||||
DataFlow::ClassNode class_, string name, DataFlow::FunctionNode res
|
||||
) {
|
||||
res = class_.getInstanceMethod(name)
|
||||
}
|
||||
|
||||
query string getAccessModifier(DataFlow::PropRef ref, Expr prop) {
|
||||
prop = ref.getPropertyNameExpr() and
|
||||
if ref.isPrivateField() then result = "Private" else result = "Public"
|
||||
}
|
||||
|
||||
class Configuration extends DataFlow::Configuration {
|
||||
Configuration() { this = "ClassDataFlowTestingConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
source.getEnclosingExpr().(StringLiteral).getValue().toLowerCase() = "source"
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
any(DataFlow::CallNode call | call.getCalleeName() = "sink").getAnArgument() = sink
|
||||
}
|
||||
}
|
||||
|
||||
query predicate dataflow(DataFlow::Node pred, DataFlow::Node succ) {
|
||||
any(Configuration c).hasFlow(pred, succ)
|
||||
}
|
||||
|
||||
query BlockStmt staticInitializer(ClassDefinition cd) { result = cd.getAStaticInitializerBlock() }
|
||||
|
||||
Reference in New Issue
Block a user