Thread (22 messages) 22 messages, 7 authors, 2020-11-18

violating function pointer signature

From: Peter Zijlstra <peterz@infradead.org>
Date: 2020-11-18 13:22:35
Also in: bpf, linux-toolchains, lkml

On Tue, Nov 17, 2020 at 03:34:51PM -0500, Steven Rostedt wrote:
quoted
quoted
Since all tracepoints callbacks have at least one parameter (__data), we
could declare tp_stub_func as:

static void tp_stub_func(void *data, ...)
{
return;
}

And now C knows that tp_stub_func() can be called with one or more
parameters, and had better be able to deal with it!  
AFAIU this won't work.

C99 6.5.2.2 Function calls

"If the function is defined with a type that is not compatible with the type (of the
expression) pointed to by the expression that denotes the called function, the behavior is
undefined."
But is it really a problem in practice. I'm sure we could create an objtool
function to check to make sure we don't break anything at build time.
I think that as long as the function is completely empty (it never
touches any of the arguments) this should work in practise.

That is:

  void tp_nop_func(void) { }

can be used as an argument to any function pointer that has a void
return. In fact, I already do that, grep for __static_call_nop().

I'm not sure what the LLVM-CFI crud makes of it, but that's their
problem.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help