From 23c4615f5e4aff1ff85918aa666b35864ab34089 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Oct 2023 12:19:48 +0100 Subject: Disallow direct return a compound literal of a slice with elements --- src/check_stmt.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/check_stmt.cpp') diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 0fe44289c..b93be734e 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2291,6 +2291,23 @@ gb_internal void check_return_stmt(CheckerContext *ctx, Ast *node) { } } } + + for (Operand &o : operands) { + if (o.expr == nullptr) { + continue; + } + if (o.expr->kind != Ast_CompoundLit || !is_type_slice(o.type)) { + continue; + } + ast_node(cl, CompoundLit, o.expr); + if (cl->elems.count == 0) { + continue; + } + gbString s = type_to_string(o.type); + error(o.expr, "It is unsafe to return a compound literal of a slice ('%s') with elements from a procedure, as the contents of the slice uses the current stack frame's memory", s); + gb_string_free(s); + } + } gb_internal void check_for_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { -- cgit v1.2.3