68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/bash -u
 | |
| # Copyright 2020 Google Inc.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #      http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| #
 | |
| ################################################################################
 | |
| cd $OUT
 | |
| 
 | |
| if (( $# > 0 )); then
 | |
|   FUZZ_TARGETS="$@"
 | |
| else
 | |
|   FUZZ_TARGETS="$(find . -maxdepth 1 -type f -executable -printf '%P\n')"
 | |
| fi
 | |
| 
 | |
| # Timeout for running a single fuzz target.
 | |
| if [ -z "$COLLECT_DFT_TIMEOUT" ]; then
 | |
|   COLLECT_DFT_TIMEOUT=1h
 | |
| fi
 | |
| 
 | |
| # Number of CPUs available, this is needed for running targets in parallel.
 | |
| NPROC=$(nproc)
 | |
| 
 | |
| function run_one_target {
 | |
|   local target=$1
 | |
|   local corpus="/corpus/${target}"
 | |
|   local traces="$OUT/${target}_dft"
 | |
| 
 | |
|   # Put the logs in $OUT as well for debugging purposes.
 | |
|   local log="$OUT/${target}_dft.log"
 | |
| 
 | |
|   rm -rf $traces && mkdir -p $traces
 | |
| 
 | |
|   timeout $COLLECT_DFT_TIMEOUT dataflow_tracer.py $OUT/$target $corpus $traces &> $log
 | |
|   if (( $? != 0 )); then
 | |
|     echo "Error occured while collecting data flow traces for $target:"
 | |
|     cat $log
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # Run each fuzz target, write data flow traces into corresponding dir in $OUT.
 | |
| for fuzz_target in $FUZZ_TARGETS; do
 | |
|   # Skip binaries that do not seem to be fuzz targets.
 | |
|   grep "LLVMFuzzerTestOneInput" $fuzz_target > /dev/null 2>&1 || continue
 | |
|   
 | |
|   echo "Running $fuzz_target"
 | |
|   run_one_target $fuzz_target &
 | |
| 
 | |
|   # Do not spawn more processes than the number of CPUs available.
 | |
|   n_child_proc=$(jobs -rp | wc -l)
 | |
|   while [ "$n_child_proc" -eq "$NPROC" ]; do
 | |
|     sleep 4
 | |
|     n_child_proc=$(jobs -rp | wc -l)
 | |
|   done
 | |
| done
 | |
| 
 | |
| # Wait for background processes to finish.
 | |
| wait
 |