[DTrace-devel] [PATCH] Trigger DIVZERO fault when the divider is 0

Kris Van Hees kris.van.hees at oracle.com
Tue Jan 19 22:58:56 PST 2021


Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c                             |  8 +++++
 test/unittest/error/tst.DTRACEFLT_DIVZERO.d   | 34 -------------------
 .../error/tst.DTRACEFLT_DIVZERO.div.d         | 34 +++++++++++++++++++
 .../error/tst.DTRACEFLT_DIVZERO.div.r         |  3 ++
 .../error/tst.DTRACEFLT_DIVZERO.mod.d         | 34 +++++++++++++++++++
 .../error/tst.DTRACEFLT_DIVZERO.mod.r         |  3 ++
 test/unittest/error/tst.DTRACEFLT_DIVZERO.r   |  4 ---
 test/unittest/error/tst.DTRACEFLT_DIVZERO.r.p |  3 --
 8 files changed, 82 insertions(+), 41 deletions(-)
 delete mode 100644 test/unittest/error/tst.DTRACEFLT_DIVZERO.d
 create mode 100644 test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
 create mode 100644 test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
 create mode 100644 test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
 create mode 100644 test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
 delete mode 100644 test/unittest/error/tst.DTRACEFLT_DIVZERO.r
 delete mode 100755 test/unittest/error/tst.DTRACEFLT_DIVZERO.r.p

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index cd911430..33e01cf3 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1926,6 +1926,14 @@ dt_cg_arithmetic_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
 		uint_t	lbl_L3 = dt_irlist_label(dlp);
 		uint_t	lbl_L4 = dt_irlist_label(dlp);
 		uint_t	lbl_L5 = dt_irlist_label(dlp);
+		uint_t	lbl_valid = dt_irlist_label(dlp);
+
+		/* First ensure we do not perform a division by zero. */
+		emit(dlp,  BPF_BRANCH_IMM(BPF_JNE, dnp->dn_right->dn_reg, 0,
+					  lbl_valid));
+		dt_cg_probe_error(yypcb, -1, DTRACEFLT_DIVZERO, 0);
+		emitl(dlp, lbl_valid,
+			   BPF_NOP());
 
 		emit(dlp,  BPF_BRANCH_IMM(BPF_JSLT, dnp->dn_left->dn_reg, 0, lbl_L3));
 		emit(dlp,  BPF_BRANCH_IMM(BPF_JSLT, dnp->dn_right->dn_reg, 0, lbl_L1));
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.d
deleted file mode 100644
index 1899d719..00000000
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.d
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Oracle Linux DTrace.
- * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
- * Licensed under the Universal Permissive License v 1.0 as shown at
- * http://oss.oracle.com/licenses/upl.
- */
-/* @@xfail: dtv2 */
-
-/*
- * ASSERTION:
- *	To test DTRACEFLT_DIVZERO error
- *
- * SECTION: dtrace Provider
- *
- */
-
-
-#pragma D option quiet
-
-ERROR
-{
-	printf("The arguments are %u %u %u %d %u\n",
-		arg1, arg2, arg3, arg4, arg5);
-	exit(0);
-}
-
-char *s;
-
-BEGIN
-{
-	i = 1;
-	j = 2;
-	j = i/(j-2);
-}
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
new file mode 100644
index 00000000..c2be0082
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
@@ -0,0 +1,34 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test DTRACEFLT_DIVZERO error reporting for a division by 0.
+ *
+ * SECTION: dtrace Provider
+ */
+
+#pragma D option quiet
+
+ERROR
+/arg2 == 1 && arg3 == -1 && arg4 == 4 && arg5 == 0/
+{
+	exit(0);
+}
+
+ERROR
+/arg2 != 1 || arg3 != -1 || arg4 != 4 || arg5 != 0/
+{
+	exit(1);
+}
+
+BEGIN
+{
+	i = 1;
+	j = 2;
+	j = i / (j-2);
+	exit(1);
+}
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
new file mode 100644
index 00000000..bf52169d
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
new file mode 100644
index 00000000..7351a802
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
@@ -0,0 +1,34 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test DTRACEFLT_DIVZERO error reporting for a modulo 0 operation.
+ *
+ * SECTION: dtrace Provider
+ */
+
+#pragma D option quiet
+
+ERROR
+/arg2 == 1 && arg3 == -1 && arg4 == 4 && arg5 == 0/
+{
+	exit(0);
+}
+
+ERROR
+/arg2 != 1 || arg3 != -1 || arg4 != 4 || arg5 != 0/
+{
+	exit(1);
+}
+
+BEGIN
+{
+	i = 1;
+	j = 2;
+	j = i % (j-2);
+	exit(1);
+}
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
new file mode 100644
index 00000000..bf52169d
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.r
deleted file mode 100644
index 50150e53..00000000
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.r
+++ /dev/null
@@ -1,4 +0,0 @@
-The arguments are 2 3 16 4 #
-
--- @@stderr --
-dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): divide-by-zero in action #3 at DIF offset 16
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.r.p b/test/unittest/error/tst.DTRACEFLT_DIVZERO.r.p
deleted file mode 100755
index ef8bd239..00000000
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.r.p
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sed -f
-# The last argument has an unpredictable value.
-/^The arguments/s/ [0-9][0-9]*$/ #/
-- 
2.28.0




More information about the DTrace-devel mailing list