Java: automodel application mode: refactor varargs endpoint class to rely on normal argument node for nicer extracted examples

This commit is contained in:
Stephan Brandauer
2023-08-07 12:18:28 +02:00
parent 650ff8db87
commit e1a5eba61b
3 changed files with 15 additions and 11 deletions

View File

@@ -24,13 +24,17 @@ newtype JavaRelatedLocationType = CallContext()
newtype TApplicationModeEndpoint =
TExplicitArgument(Call call, DataFlow::Node arg) {
exists(Argument argExpr |
arg.asExpr() = argExpr and not argExpr.isVararg() and call = argExpr.getCall()
arg.asExpr() = argExpr and call = argExpr.getCall() and not argExpr.isVararg()
)
} or
TInstanceArgument(Call call, DataFlow::Node arg) { arg = DataFlow::getInstanceArgument(call) } or
TImplicitVarargsArray(Call call, DataFlow::ImplicitVarargsArray varargs, int idx) {
varargs.getCall() = call and
idx = min(Argument arg, int n | arg = call.getArgument(n) and arg.isVararg() | n)
TImplicitVarargsArray(Call call, DataFlow::Node arg, int idx) {
exists(Argument argExpr |
arg.asExpr() = argExpr and
call = argExpr.getCall() and
argExpr.isVararg() and
idx = min(int n | argExpr = call.getArgument(n) and argExpr.isVararg() | n)
)
}
/**
@@ -96,18 +100,18 @@ class InstanceArgument extends ApplicationModeEndpoint, TInstanceArgument {
*/
class ImplicitVarargsArray extends ApplicationModeEndpoint, TImplicitVarargsArray {
Call call;
DataFlow::ImplicitVarargsArray varargs;
DataFlow::Node vararg;
int idx;
ImplicitVarargsArray() { this = TImplicitVarargsArray(call, varargs, idx) }
ImplicitVarargsArray() { this = TImplicitVarargsArray(call, vararg, idx) }
override predicate isArgOf(Call c, int i) { c = call and i = idx }
override Top asTop() { result = this.getCall() }
override DataFlow::Node asNode() { result = varargs }
override DataFlow::Node asNode() { result = vararg }
override string toString() { result = varargs.toString() }
override string toString() { result = vararg.toString() }
}
/**