[DTrace-devel] [PATCH REVIEWED 02/02] Trigger DIVZERO fault when the divider is 0
Kris Van Hees
kris.van.hees at oracle.com
Thu Mar 18 21:53:42 PDT 2021
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 8 +++++
test/unittest/error/tst.DTRACEFLT_DIVZERO.d | 34 -------------------
.../error/tst.DTRACEFLT_DIVZERO.div.d | 29 ++++++++++++++++
.../error/tst.DTRACEFLT_DIVZERO.div.r | 3 ++
.../error/tst.DTRACEFLT_DIVZERO.mod.d | 29 ++++++++++++++++
.../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, 72 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 63726793..8ba23530 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1912,6 +1912,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..2dd946ea
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
@@ -0,0 +1,29 @@
+/*
+ * 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
+
+BEGIN
+{
+ myepid = epid;
+ i = 1;
+ j = 2;
+ j = i / (j - 2);
+ exit(1);
+}
+
+ERROR
+{
+ exit(arg1 != myepid || arg2 != 1 || arg3 != -1 ||
+ arg4 != DTRACEFLT_DIVZERO || arg5 != 0);
+}
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..d79a2774
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 3 (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..227de4fd
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
@@ -0,0 +1,29 @@
+/*
+ * 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
+
+BEGIN
+{
+ myepid = epid;
+ i = 1;
+ j = 2;
+ j = i % (j - 2);
+ exit(1);
+}
+
+ERROR
+{
+ exit(arg1 != myepid || arg2 != 1 || arg3 != -1 ||
+ arg4 != DTRACEFLT_DIVZERO || arg5 != 0);
+}
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..d79a2774
--- /dev/null
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 3 (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