From 503410e16966991eb03adfe15fd727e6bd5d109c Mon Sep 17 00:00:00 2001
From: Anh <zenpoems@gmail.com>
Date: Sun, 10 Feb 2019 10:58:57 -0800
Subject: [PATCH] Add graph tests

---
 afl_transforms/tools/zax/test/test_graph.sh   | 94 +++++++++++++++++++
 .../tools/zax/test/test_mystrlen.cpp          | 20 ++++
 afl_transforms/tools/zax/zax_base.cpp         |  2 +
 3 files changed, 116 insertions(+)
 create mode 100755 afl_transforms/tools/zax/test/test_graph.sh
 create mode 100644 afl_transforms/tools/zax/test/test_mystrlen.cpp

diff --git a/afl_transforms/tools/zax/test/test_graph.sh b/afl_transforms/tools/zax/test/test_graph.sh
new file mode 100755
index 0000000..9410509
--- /dev/null
+++ b/afl_transforms/tools/zax/test/test_graph.sh
@@ -0,0 +1,94 @@
+PUT=test_mystrlen.exe
+MYARG="123456789a"
+
+ZAFL_PUT="$PUT.zafl $PUT.zafl.c $PUT.zafl.g $PUT.zafl.d $PUT.zafl.d.g $PUT.zafl.c.d.g"
+
+log_msg()
+{
+	echo "TEST PASS: $1"
+}
+
+log_error()
+{
+	echo "TEST FAIL: $1"
+	exit 1
+}
+
+build_one()
+{
+	orig=$1
+	zafl=$2
+	shift
+	shift
+	zafl.sh $orig $zafl $@
+	if [ $? -eq 0 ]; then
+		log_msg "build $zafl" 
+	else
+		log_error "build $zafl" 
+	fi
+}
+
+build_all()
+{
+	g++ test_mystrlen.cpp -o $PUT
+
+	build_one $PUT $PUT.zafl -v -t $PUT.analysis 
+	build_one $PUT $PUT.zafl.c -c -v -t $PUT.analysis.c
+	build_one $PUT $PUT.zafl.g -g -v -t $PUT.analysis.g
+	build_one $PUT $PUT.zafl.d -d -v -t $PUT.analysis.d
+	build_one $PUT $PUT.zafl.d.g -d -g -v -t $PUT.analysis.d.g
+	build_one $PUT $PUT.zafl.c.d.g -d -g -v -t $PUT.analysis.c.d.g
+}
+
+clean_all()
+{
+	rm -fr ${PUT}* 
+}
+
+verify_output()
+{
+	./$PUT $MYARG TR > $PUT.output.orig
+
+	for p in $ZAFL_PUT
+	do
+		echo "Program under test: $p"
+		./${p} $MYARG > $p.output
+		diff $PUT.output.orig $p.output
+		if [ ! $? -eq 0 ]; then
+			log_error "output verification failure: $p.output"
+		fi
+
+	done
+
+	log_msg "output verified"
+}
+
+verify_afl_map()
+{
+	for p in $ZAFL_PUT
+	do
+		echo "Computing trace maps for input $MYARG"
+		afl-showmap -o $p.map -- ./$p $MYARG
+		cut -d':' -f2 $p.map | sort -r | head -n 1 > $p.max_count
+	done
+
+	for p in $ZAFL_PUT
+	do
+		diff $PUT.zafl.max_count $p.max_count >/dev/null 2>&1
+		if [ $? -eq 0 ]; then
+			log_msg "maximum edge counter for $PUT.zafl and $p match"
+		else
+			echo -n "Maximum count for $PUT: "
+			cat $PUT.zafl.max_count
+			echo -n "Maximum count for $p: "
+			cat $p.max_count
+			log_error "maximum edge counter does not match for $PUT.zafl and $p"
+		fi
+	done
+}
+
+clean_all
+build_all
+verify_output
+verify_afl_map
+clean_all
diff --git a/afl_transforms/tools/zax/test/test_mystrlen.cpp b/afl_transforms/tools/zax/test/test_mystrlen.cpp
new file mode 100644
index 0000000..e933cd1
--- /dev/null
+++ b/afl_transforms/tools/zax/test/test_mystrlen.cpp
@@ -0,0 +1,20 @@
+#include <iostream>
+using namespace std;
+
+size_t my_strlen(char *arg)
+{
+	auto count = 0;
+	while (*arg!='\0')
+	{
+		count++;
+		arg++;
+	}
+
+	return count;
+}
+
+int main(int argc, char **argv)
+{
+	if (argc > 1)
+		cout << "length: " << my_strlen(argv[1]) << endl;
+}
diff --git a/afl_transforms/tools/zax/zax_base.cpp b/afl_transforms/tools/zax/zax_base.cpp
index ccd6b4c..754441f 100644
--- a/afl_transforms/tools/zax/zax_base.cpp
+++ b/afl_transforms/tools/zax/zax_base.cpp
@@ -833,6 +833,8 @@ int ZaxBase_t::execute()
 
 		if (m_verbose)
 		{
+ 			getFileIR()->assembleRegistry();
+		 	getFileIR()->setBaseIDS();
 			cout << "Post transformation CFG for " << f->getName() << ":" << endl;
 			auto post_cfg=ControlFlowGraph_t::factory(f);	
 			cout << *post_cfg << endl;
-- 
GitLab