[DTrace-devel] [PATCH 3/4] cg: reject clauses using return() by default

Kris Van Hees kris.van.hees at oracle.com
Tue Jul 15 05:48:21 UTC 2025


Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c      | 10 +++++++++-
 libdtrace/dt_errtags.h |  1 +
 libdtrace/dtrace.h     | 19 ++++++++++---------
 3 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 738597ed..0607cd4e 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -875,6 +875,10 @@ dt_cg_call_clause(dtrace_hdl_t *dtp, dtrace_stmtdesc_t *sdp, dt_clause_arg_t *ar
 	 */
 	if (prp->prov->impl->reject_clause != NULL)
 		prp->prov->impl->reject_clause(prp, sdp->dtsd_clauseflags);
+	else if (sdp->dtsd_clauseflags & DT_CLSFLAG_RETURN)
+		xyerror(D_ACT_RETURN, "return() not allowed for %s:%s:%s:%s\n",
+			prp->desc->prv, prp->desc->mod, prp->desc->fun,
+			prp->desc->prb);
 
 	/*
 	 *	if (*dctx.act != act)	// ldw %r0, [%r9 + DCTX_ACT]
@@ -1810,9 +1814,13 @@ dt_cg_clsflags(dt_pcb_t *pcb, dtrace_actkind_t kind, const dt_node_t *dnp)
 {
 	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
 
-	if (DTRACEACT_ISDESTRUCTIVE(kind))
+	if (DTRACEACT_ISDESTRUCTIVE(kind)) {
 		*cfp |= DT_CLSFLAG_DESTRUCT;
 
+		if (kind == DTRACEACT_RETURN)
+			*cfp |= DT_CLSFLAG_RETURN;
+	}
+
 	if (kind == DTRACEACT_COMMIT) {
 		if (*cfp & (DT_CLSFLAG_DATAREC | DT_CLSFLAG_AGGREGATION))
 			dnerror(dnp, D_COMM_DREC, "commit( ) may "
diff --git a/libdtrace/dt_errtags.h b/libdtrace/dt_errtags.h
index b8648d17..65c59cba 100644
--- a/libdtrace/dt_errtags.h
+++ b/libdtrace/dt_errtags.h
@@ -158,6 +158,7 @@ typedef enum {
 	D_AGG_NULL,			/* aggregation stmt has null effect */
 	D_AGG_SCALAR,			/* aggregating function needs scalar */
 	D_ACT_SPEC,			/* destructive action after speculate */
+	D_ACT_RETURN,			/* return() not allowed for ... */
 	D_EXIT_SPEC,			/* exit() action after speculate */
 	D_DREC_COMM,			/* data action after commit() */
 	D_PRINTA_PROTO,			/* printa() prototype mismatch */
diff --git a/libdtrace/dtrace.h b/libdtrace/dtrace.h
index 20672d3f..f0c1b8dc 100644
--- a/libdtrace/dtrace.h
+++ b/libdtrace/dtrace.h
@@ -154,15 +154,16 @@ typedef struct dtrace_stmtdesc {
 } dtrace_stmtdesc_t;
 
 /* dtsd clause flags */
-#define DT_CLSFLAG_DATAREC		1	/* data-recording */
-#define DT_CLSFLAG_SPECULATE		2	/* speculate */
-#define DT_CLSFLAG_COMMIT		4	/* commit */
-#define DT_CLSFLAG_COMMIT_DISCARD	8	/* commit/discard */
-#define DT_CLSFLAG_EXIT			16	/* exit */
-#define DT_CLSFLAG_DESTRUCT		32	/* destructive */
-#define DT_CLSFLAG_AGGREGATION		64	/* aggregation */
-#define DT_CLSFLAG_USDT_INCLUDE		128	/* could be used in USDT clause */
-#define DT_CLSFLAG_USDT_EXCLUDE		256	/* could not be used in USDT clause */
+#define DT_CLSFLAG_DATAREC		0x0001	/* data-recording */
+#define DT_CLSFLAG_SPECULATE		0x0002	/* speculate */
+#define DT_CLSFLAG_COMMIT		0x0004	/* commit */
+#define DT_CLSFLAG_COMMIT_DISCARD	0x0008	/* commit/discard */
+#define DT_CLSFLAG_EXIT			0x0010	/* exit */
+#define DT_CLSFLAG_DESTRUCT		0x0020	/* destructive */
+#define DT_CLSFLAG_RETURN		0x0040	/* aggregation */
+#define DT_CLSFLAG_AGGREGATION		0x0080	/* return action */
+#define DT_CLSFLAG_USDT_INCLUDE		0x0100	/* could be used in USDT clause */
+#define DT_CLSFLAG_USDT_EXCLUDE		0x0200	/* could not be used in USDT clause */
 
 typedef int dtrace_stmt_f(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
     dtrace_stmtdesc_t *sdp, void *data);
-- 
2.43.5




More information about the DTrace-devel mailing list