1 // Copyright 2021 Code Intelligence GmbH
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package com.code_intelligence.jazzer.instrumentor
16
17 import com.code_intelligence.jazzer.runtime.CoverageMap
18
extractClassFileMajorVersionnull19 fun extractClassFileMajorVersion(classfileBuffer: ByteArray): Int {
20 return ((classfileBuffer[6].toInt() and 0xff) shl 8) or (classfileBuffer[7].toInt() and 0xff)
21 }
22
23 class ClassInstrumentor(private val internalClassName: String, bytecode: ByteArray) {
24
25 var instrumentedBytecode = bytecode
26 private set
27
coveragenull28 fun coverage(initialEdgeId: Int): Int {
29 val edgeCoverageInstrumentor = EdgeCoverageInstrumentor(
30 defaultEdgeCoverageStrategy,
31 defaultCoverageMap,
32 initialEdgeId,
33 )
34 instrumentedBytecode = edgeCoverageInstrumentor.instrument(internalClassName, instrumentedBytecode)
35 return edgeCoverageInstrumentor.numEdges
36 }
37
traceDataFlownull38 fun traceDataFlow(instrumentations: Set<InstrumentationType>) {
39 instrumentedBytecode =
40 TraceDataFlowInstrumentor(instrumentations).instrument(internalClassName, instrumentedBytecode)
41 }
42
hooksnull43 fun hooks(hooks: Iterable<Hook>, classWithHooksEnabledField: String?) {
44 instrumentedBytecode = HookInstrumentor(
45 hooks,
46 java6Mode = extractClassFileMajorVersion(instrumentedBytecode) < 51,
47 classWithHooksEnabledField = classWithHooksEnabledField,
48 ).instrument(internalClassName, instrumentedBytecode)
49 }
50
51 companion object {
52 val defaultEdgeCoverageStrategy = StaticMethodStrategy()
53 val defaultCoverageMap = CoverageMap::class.java
54 }
55 }
56