On 8/23/24 15:24, Michael Clark wrote:
On 8/15/24 06:24, Michael Clark wrote:
Hi Folks,

like I said this is crazy talk as alloca isn't even in the C standard. but VLAs are, and the current implementation of VLAs depends on alloca.

one more thing. it doesn't require PT_GNU_STACK or writable stacks like GCC nested functions. :-) so I think it is safer but it does have safety issues, mostly related to stack overflows but its going to need some careful analysis with respect to ROP. returning deduced VLA types with bounds references in frame metadata and a chain of frame pointers for dynamic alloca might help. also my experiment in LLVM needs clobbers in the parent frame because while I was able to modify the epilogue based on an attribute, I so far haven't figured out how to make it look to the translator like an alloca in the parent frame so that subsequent references to earlier locals save their stack pointer in a register.

this was my first test function:

char* f(int n) __attribute__((allocareturn))
{
    static const char* fmt = "num-%d";
    int len = snprintf(0, 0, fmt, n);
    char *str = __builtin_alloca(len+1);
    snprintf(str, len+1, fmt, n);
    return str;
}

but this also works:

char* f(int n) __attribute__((allocareturn))
{
    static const char* fmt = "num-%d";
    int len = snprintf(0, 0, fmt, n);
    char str[len+1];
    snprintf(str, len+1, fmt, n);
    return str;
}

and this is even better:

f(int n) -> auto
{
    static const char* fmt = "num-%d";
    int len = snprintf(0, 0, fmt, n);
    char str[len+1];
    snprintf(str, len+1, fmt, n);
    return str;
}

like a reference in an implicit copy constructor for a structure.

struct anon123456 { int &n; int arr[n]; };

that would be positioned at the end of the fixed frame so that the parent function knows where the bound is. like I said. crazy talk.

Michael.

Reply via email to