xref: /aosp_15_r20/external/bc/scripts/radamsa.sh (revision 5a6e848804d15c18a0125914844ee4eb0bda4fcf)
1*5a6e8488SAndroid Build Coastguard Worker#! /bin/sh
2*5a6e8488SAndroid Build Coastguard Worker#
3*5a6e8488SAndroid Build Coastguard Worker# SPDX-License-Identifier: BSD-2-Clause
4*5a6e8488SAndroid Build Coastguard Worker#
5*5a6e8488SAndroid Build Coastguard Worker# Copyright (c) 2018-2024 Gavin D. Howard and contributors.
6*5a6e8488SAndroid Build Coastguard Worker#
7*5a6e8488SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
8*5a6e8488SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met:
9*5a6e8488SAndroid Build Coastguard Worker#
10*5a6e8488SAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright notice, this
11*5a6e8488SAndroid Build Coastguard Worker#   list of conditions and the following disclaimer.
12*5a6e8488SAndroid Build Coastguard Worker#
13*5a6e8488SAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright notice,
14*5a6e8488SAndroid Build Coastguard Worker#   this list of conditions and the following disclaimer in the documentation
15*5a6e8488SAndroid Build Coastguard Worker#   and/or other materials provided with the distribution.
16*5a6e8488SAndroid Build Coastguard Worker#
17*5a6e8488SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18*5a6e8488SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*5a6e8488SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*5a6e8488SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21*5a6e8488SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*5a6e8488SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*5a6e8488SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*5a6e8488SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25*5a6e8488SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*5a6e8488SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27*5a6e8488SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE.
28*5a6e8488SAndroid Build Coastguard Worker#
29*5a6e8488SAndroid Build Coastguard Worker
30*5a6e8488SAndroid Build Coastguard Worker# This script uses some non-POSIX behavior, but since it's meant for bc
31*5a6e8488SAndroid Build Coastguard Worker# maintainers only, I can accept that.
32*5a6e8488SAndroid Build Coastguard Worker
33*5a6e8488SAndroid Build Coastguard Worker# Get an entry from the file. If an argument exists, it is an index. Get that
34*5a6e8488SAndroid Build Coastguard Worker# line. Otherwise, get a random line.
35*5a6e8488SAndroid Build Coastguard Workergetentry() {
36*5a6e8488SAndroid Build Coastguard Worker
37*5a6e8488SAndroid Build Coastguard Worker	# Figure out if we get a specific or random line.
38*5a6e8488SAndroid Build Coastguard Worker	if [ $# -gt 0 ]; then
39*5a6e8488SAndroid Build Coastguard Worker		entnum="$1"
40*5a6e8488SAndroid Build Coastguard Worker	else
41*5a6e8488SAndroid Build Coastguard Worker		entnum=0
42*5a6e8488SAndroid Build Coastguard Worker	fi
43*5a6e8488SAndroid Build Coastguard Worker
44*5a6e8488SAndroid Build Coastguard Worker	# Get data from stdin and figure out how many lines there are.
45*5a6e8488SAndroid Build Coastguard Worker	e=$(cat -)
46*5a6e8488SAndroid Build Coastguard Worker	num=$(printf '%s\n' "$e" | wc -l)
47*5a6e8488SAndroid Build Coastguard Worker
48*5a6e8488SAndroid Build Coastguard Worker	# Figure out what line we are going to get. Uses bc's own PRNG.
49*5a6e8488SAndroid Build Coastguard Worker	if [ "$entnum" -eq 0 ]; then
50*5a6e8488SAndroid Build Coastguard Worker		rand=$(printf 'irand(%s) + 1\n' "$num" | "$bcdir/bc")
51*5a6e8488SAndroid Build Coastguard Worker	else
52*5a6e8488SAndroid Build Coastguard Worker		rand="$entnum"
53*5a6e8488SAndroid Build Coastguard Worker	fi
54*5a6e8488SAndroid Build Coastguard Worker
55*5a6e8488SAndroid Build Coastguard Worker	# Get the line.
56*5a6e8488SAndroid Build Coastguard Worker	ent=$(printf '%s\n' "$e" | tail -n +$rand | head -n 1)
57*5a6e8488SAndroid Build Coastguard Worker
58*5a6e8488SAndroid Build Coastguard Worker	printf '%s\n' "$ent"
59*5a6e8488SAndroid Build Coastguard Worker}
60*5a6e8488SAndroid Build Coastguard Worker
61*5a6e8488SAndroid Build Coastguard Workerscript="$0"
62*5a6e8488SAndroid Build Coastguard Workerdir=$(dirname "$script")
63*5a6e8488SAndroid Build Coastguard Worker
64*5a6e8488SAndroid Build Coastguard Worker. "$dir/functions.sh"
65*5a6e8488SAndroid Build Coastguard Worker
66*5a6e8488SAndroid Build Coastguard Worker# Just print the usage and exit with an error. This can receive a message to
67*5a6e8488SAndroid Build Coastguard Worker# print.
68*5a6e8488SAndroid Build Coastguard Worker# @param 1  A message to print.
69*5a6e8488SAndroid Build Coastguard Workerusage() {
70*5a6e8488SAndroid Build Coastguard Worker	if [ $# -eq 1 ]; then
71*5a6e8488SAndroid Build Coastguard Worker		printf '%s\n\n' "$1"
72*5a6e8488SAndroid Build Coastguard Worker	fi
73*5a6e8488SAndroid Build Coastguard Worker	printf 'usage: %s dir\n' "$script"
74*5a6e8488SAndroid Build Coastguard Worker	exit 1
75*5a6e8488SAndroid Build Coastguard Worker}
76*5a6e8488SAndroid Build Coastguard Worker
77*5a6e8488SAndroid Build Coastguard Worker# Command-line processing.
78*5a6e8488SAndroid Build Coastguard Workerif [ "$#" -lt 1 ]; then
79*5a6e8488SAndroid Build Coastguard Worker	usage "Not enough arguments"
80*5a6e8488SAndroid Build Coastguard Workerfi
81*5a6e8488SAndroid Build Coastguard Worker
82*5a6e8488SAndroid Build Coastguard Workerd="$1"
83*5a6e8488SAndroid Build Coastguard Workershift
84*5a6e8488SAndroid Build Coastguard Workercheck_d_arg "$d"
85*5a6e8488SAndroid Build Coastguard Worker
86*5a6e8488SAndroid Build Coastguard Workerbcdir="$dir/../bin"
87*5a6e8488SAndroid Build Coastguard Worker
88*5a6e8488SAndroid Build Coastguard Worker# Figure out the correct input directory.
89*5a6e8488SAndroid Build Coastguard Workerif [ "$d" = "bc" ]; then
90*5a6e8488SAndroid Build Coastguard Worker	inputs="$dir/../tests/fuzzing/bc_inputs1"
91*5a6e8488SAndroid Build Coastguard Worker	opts="-lq"
92*5a6e8488SAndroid Build Coastguard Workerelif [ "$d" = "dc" ]; then
93*5a6e8488SAndroid Build Coastguard Worker	inputs="$dir/../test/fuzzing/dc_inputs"
94*5a6e8488SAndroid Build Coastguard Worker	opts="-x"
95*5a6e8488SAndroid Build Coastguard Workerelse
96*5a6e8488SAndroid Build Coastguard Worker	err_exit "wrong type of executable" 1
97*5a6e8488SAndroid Build Coastguard Workerfi
98*5a6e8488SAndroid Build Coastguard Worker
99*5a6e8488SAndroid Build Coastguard Workerexport ASAN_OPTIONS="abort_on_error=1:allocator_may_return_null=1"
100*5a6e8488SAndroid Build Coastguard Worker
101*5a6e8488SAndroid Build Coastguard Workerentries=$(cat "$dir/radamsa.txt")
102*5a6e8488SAndroid Build Coastguard Worker
103*5a6e8488SAndroid Build Coastguard WorkerIFS=$'\n'
104*5a6e8488SAndroid Build Coastguard Worker
105*5a6e8488SAndroid Build Coastguard Workergo=1
106*5a6e8488SAndroid Build Coastguard Worker
107*5a6e8488SAndroid Build Coastguard Worker# Infinite loop.
108*5a6e8488SAndroid Build Coastguard Workerwhile [ "$go" -ne 0 ]; do
109*5a6e8488SAndroid Build Coastguard Worker
110*5a6e8488SAndroid Build Coastguard Worker	# If we are running bc, fuzz command-line arguments in BC_ENV_ARGS.
111*5a6e8488SAndroid Build Coastguard Worker	if [ "$d" = "bc" ]; then
112*5a6e8488SAndroid Build Coastguard Worker
113*5a6e8488SAndroid Build Coastguard Worker		entry=$(cat -- "$dir/radamsa.txt" | getentry)
114*5a6e8488SAndroid Build Coastguard Worker		items=$(printf '%s\n' "$entry" | radamsa -n 10)
115*5a6e8488SAndroid Build Coastguard Worker
116*5a6e8488SAndroid Build Coastguard Worker		printf '%s\n' "$items"
117*5a6e8488SAndroid Build Coastguard Worker
118*5a6e8488SAndroid Build Coastguard Worker		for i in `seq 1 10`; do
119*5a6e8488SAndroid Build Coastguard Worker
120*5a6e8488SAndroid Build Coastguard Worker			item=$(printf '%s\n' "$items" | getentry "$i")
121*5a6e8488SAndroid Build Coastguard Worker
122*5a6e8488SAndroid Build Coastguard Worker			export BC_ENV_ARGS="$item"
123*5a6e8488SAndroid Build Coastguard Worker			echo 'halt' | "$bcdir/$d"
124*5a6e8488SAndroid Build Coastguard Worker			err=$?
125*5a6e8488SAndroid Build Coastguard Worker
126*5a6e8488SAndroid Build Coastguard Worker			checkcrash "$d" "$err" "radamsa env args: \"$item\""
127*5a6e8488SAndroid Build Coastguard Worker		done
128*5a6e8488SAndroid Build Coastguard Worker
129*5a6e8488SAndroid Build Coastguard Worker	fi
130*5a6e8488SAndroid Build Coastguard Worker
131*5a6e8488SAndroid Build Coastguard Worker	f=$(ls "$inputs" | getentry)
132*5a6e8488SAndroid Build Coastguard Worker	l=$(cat "$inputs/$f" | wc -l)
133*5a6e8488SAndroid Build Coastguard Worker	ll=$(printf '%s^2\n' "$l" | bc)
134*5a6e8488SAndroid Build Coastguard Worker
135*5a6e8488SAndroid Build Coastguard Worker	# Fuzz on the AFL++ inputs.
136*5a6e8488SAndroid Build Coastguard Worker	for i in $(seq 1 2); do
137*5a6e8488SAndroid Build Coastguard Worker		data=$(cat "$inputs/$f" | radamsa -n 1)
138*5a6e8488SAndroid Build Coastguard Worker		printf '%s\n' "$data" > "$dir/../.log_${d}_test.txt"
139*5a6e8488SAndroid Build Coastguard Worker		printf '%s\n' "$data" | timeout -s SIGTERM 5 "$bcdir/$d" "$opts" > /dev/null
140*5a6e8488SAndroid Build Coastguard Worker		err=$?
141*5a6e8488SAndroid Build Coastguard Worker		checkcrash "$d" "$err" "radamsa stdin"
142*5a6e8488SAndroid Build Coastguard Worker	done
143*5a6e8488SAndroid Build Coastguard Worker
144*5a6e8488SAndroid Build Coastguard Workerdone
145