mirror of
https://github.com/github/codeql.git
synced 2025-12-18 09:43:15 +01:00
55 lines
1.8 KiB
Plaintext
55 lines
1.8 KiB
Plaintext
/**
|
|
* Provides classes and predicates for identifying stub code.
|
|
*/
|
|
|
|
import CIL
|
|
|
|
/**
|
|
* The average number of instructions per method,
|
|
* below which an assembly is probably a stub.
|
|
*/
|
|
private float stubInstructionThreshold() { result = 5.1 }
|
|
|
|
cached
|
|
private module Cached {
|
|
/**
|
|
* A simple heuristic for determining whether an assembly is a
|
|
* reference assembly where the method bodies have dummy implementations.
|
|
* Look at the average number of instructions per method.
|
|
*/
|
|
cached
|
|
predicate assemblyIsStubImpl(Assembly asm) {
|
|
exists(int totalInstructions, int totalImplementations |
|
|
totalInstructions = count(Instruction i | i.getImplementation().getLocation() = asm) and
|
|
totalImplementations =
|
|
count(MethodImplementation i | i.getImplementation().getLocation() = asm) and
|
|
totalInstructions.(float) / totalImplementations.(float) < stubInstructionThreshold()
|
|
)
|
|
}
|
|
|
|
cached
|
|
predicate bestImplementation(MethodImplementation mi) {
|
|
not assemblyIsStubImpl(mi.getLocation()) and
|
|
not exists(MethodImplementation better | mi.getMethod() = better.getMethod() |
|
|
mi.getNumberOfInstructions() < better.getNumberOfInstructions()
|
|
or
|
|
mi.getNumberOfInstructions() = better.getNumberOfInstructions() and
|
|
mi.getLocation().getFile().toString() > better.getLocation().getFile().toString()
|
|
) and
|
|
exists(mi.getAnInstruction())
|
|
}
|
|
}
|
|
|
|
private import Cached
|
|
|
|
predicate assemblyIsStub = assemblyIsStubImpl/1;
|
|
|
|
/**
|
|
* A method implementation that is the "best" one for a particular method,
|
|
* if there are several potential implementations to choose between, and
|
|
* excludes implementations that are probably from stub/reference assemblies.
|
|
*/
|
|
class BestImplementation extends MethodImplementation {
|
|
BestImplementation() { bestImplementation(this) }
|
|
}
|