Java: Base the model printing on the shared implementation.

This commit is contained in:
Michael Nebel
2024-06-18 09:42:48 +02:00
parent 8630583856
commit 9cd16fd9d6
5 changed files with 26 additions and 115 deletions

View File

@@ -33,13 +33,13 @@ class DataFlowTargetApi extends TargetApiSpecific {
DataFlowTargetApi() { not isUninterestingForDataFlowModels(this) }
}
private module Printing implements PrintingSig {
private module ModelPrintingInput implements ModelPrintingSig {
class Api = DataFlowTargetApi;
string getProvenance() { result = "df-generated" }
}
module ModelPrinting = PrintingImpl<Printing>;
module Printing = ModelPrinting<ModelPrintingInput>;
/**
* Holds if `c` is a relevant content kind, where the underlying type is relevant.
@@ -94,7 +94,7 @@ string captureQualifierFlow(TargetApiSpecific api) {
api = returnNodeEnclosingCallable(ret) and
isOwnInstanceAccessNode(ret)
) and
result = ModelPrinting::asValueModel(api, qualifierString(), "ReturnValue")
result = Printing::asValueModel(api, qualifierString(), "ReturnValue")
}
private int accessPathLimit0() { result = 2 }
@@ -202,7 +202,7 @@ string captureThroughFlow(DataFlowTargetApi api) {
input = parameterNodeAsInput(p) and
output = returnNodeExt.getOutput() and
input != output and
result = ModelPrinting::asTaintModel(api, input, output)
result = Printing::asTaintModel(api, input, output)
)
}
@@ -250,7 +250,7 @@ string captureSource(DataFlowTargetApi api) {
ExternalFlow::sourceNode(source, kind) and
api = sink.getEnclosingCallable() and
not irrelevantSourceSinkApi(source.getEnclosingCallable(), api) and
result = ModelPrinting::asSourceModel(api, sink.getOutput(), kind)
result = Printing::asSourceModel(api, sink.getOutput(), kind)
)
}
@@ -291,6 +291,6 @@ string captureSink(DataFlowTargetApi api) {
PropagateToSink::flow(src, sink) and
ExternalFlow::sinkNode(sink, kind) and
api = src.getEnclosingCallable() and
result = ModelPrinting::asSinkModel(api, asInputArgument(src), kind)
result = Printing::asSinkModel(api, asInputArgument(src), kind)
)
}

View File

@@ -1,72 +1,11 @@
private import CaptureModelsSpecific
private import java as J
private import codeql.mad.modelgenerator.ModelPrinting
private import CaptureModelsSpecific as Specific
signature module PrintingSig {
/**
* The class of APIs relevant for model generation.
*/
class Api extends TargetApiSpecific;
private module ModelPrintingLang implements ModelPrintingLangSig {
class Callable = J::Callable;
/**
* Gets the string representation of the provenance of the models.
*/
string getProvenance();
predicate partialModel = Specific::partialModel/6;
}
module PrintingImpl<PrintingSig Printing> {
/**
* Gets the summary model for `api` with `input`, `output` and `kind`.
*/
bindingset[input, output, kind]
private string asSummaryModel(Printing::Api api, string input, string output, string kind) {
result =
asPartialModel(api) + input + ";" //
+ output + ";" //
+ kind + ";" //
+ Printing::getProvenance()
}
string asNeutralSummaryModel(Printing::Api api) {
result =
asPartialNeutralModel(api) //
+ "summary" + ";" //
+ Printing::getProvenance()
}
/**
* Gets the value summary model for `api` with `input` and `output`.
*/
bindingset[input, output]
string asValueModel(Printing::Api api, string input, string output) {
result = asSummaryModel(api, input, output, "value")
}
/**
* Gets the taint summary model for `api` with `input` and `output`.
*/
bindingset[input, output]
string asTaintModel(Printing::Api api, string input, string output) {
result = asSummaryModel(api, input, output, "taint")
}
/**
* Gets the sink model for `api` with `input` and `kind`.
*/
bindingset[input, kind]
string asSinkModel(Printing::Api api, string input, string kind) {
result =
asPartialModel(api) + input + ";" //
+ kind + ";" //
+ Printing::getProvenance()
}
/**
* Gets the source model for `api` with `output` and `kind`.
*/
bindingset[output, kind]
string asSourceModel(Printing::Api api, string output, string kind) {
result =
asPartialModel(api) + output + ";" //
+ kind + ";" //
+ Printing::getProvenance()
}
}
import ModelPrintingImpl<ModelPrintingLang>

View File

@@ -110,53 +110,25 @@ private string isExtensible(Callable c) {
}
/**
* Returns the appropriate type name for the model.
* Holds if the callable `c` is in package `package`
* and is a member of `type`.
*/
private string typeAsModel(Callable c) {
exists(RefType type | type = c.getDeclaringType() |
result =
type.getCompilationUnit().getPackage().getName() + ";" +
type.getErasure().(J::RefType).nestedName()
private predicate qualifiedName(Callable c, string package, string type) {
exists(RefType t | t = c.getDeclaringType() |
package = t.getCompilationUnit().getPackage().getName() and
type = t.getErasure().(J::RefType).nestedName()
)
}
private predicate partialModel(
Callable api, string type, string extensible, string name, string parameters
predicate partialModel(
Callable api, string package, string type, string extensible, string name, string parameters
) {
type = typeAsModel(api) and
qualifiedName(api, package, type) and
extensible = isExtensible(api) and
name = api.getName() and
parameters = ExternalFlow::paramsString(api)
}
/**
* Computes the first 6 columns for MaD rows.
*/
string asPartialModel(TargetApiSpecific api) {
exists(string type, string extensible, string name, string parameters |
partialModel(api.lift(), type, extensible, name, parameters) and
result =
type + ";" //
+ extensible + ";" //
+ name + ";" //
+ parameters + ";" //
+ /* ext + */ ";" //
)
}
/**
* Computes the first 4 columns for neutral MaD rows.
*/
string asPartialNeutralModel(TargetApiSpecific api) {
exists(string type, string name, string parameters |
partialModel(api, type, _, name, parameters) and
result =
type + ";" //
+ name + ";" //
+ parameters + ";" //
)
}
predicate isPrimitiveTypeUsedForBulkData(J::Type t) {
t.hasName(["byte", "char", "Byte", "Character"])
}

View File

@@ -80,5 +80,5 @@ string captureFlow(DataFlowTargetApi api) {
string captureNoFlow(DataFlowTargetApi api) {
not exists(DataFlowTargetApi api0 | exists(captureFlow(api0)) and api0.lift() = api.lift()) and
api.isRelevant() and
result = ModelPrinting::asNeutralSummaryModel(api)
result = Printing::asNeutralSummaryModel(api)
}

View File

@@ -283,13 +283,13 @@ private predicate output(Callable callable, TypeVariable tv, string output) {
functionalSink(callable, tv, output)
}
module Printing implements PrintingSig {
module ModelPrintingInput implements ModelPrintingSig {
class Api = TypeBasedFlowTargetApi;
string getProvenance() { result = "tb-generated" }
}
private module ModelPrinting = PrintingImpl<Printing>;
private module Printing = ModelPrinting<ModelPrintingInput>;
/**
* A class of callables that are relevant generating summaries for based
@@ -327,7 +327,7 @@ class TypeBasedFlowTargetApi extends Specific::TargetApiSpecific {
output(this, tv, output) and
input != output
|
result = ModelPrinting::asValueModel(this, input, output)
result = Printing::asValueModel(this, input, output)
)
}
}