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

Kris Van Hees
2025-07-15T05:48:27Z

Signed-off-by: Kris Van Hees <kris.van.hees@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