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
 |