A new LLVM CFI implementation
A new LLVM CFI implementation
Posted Jun 19, 2022 13:48 UTC (Sun) by mss (subscriber, #138799)Parent article: A new LLVM CFI implementation
The function return value type isn't a part of its C++ mangled name so I guess this isn't checked either.
Posted Jun 19, 2022 14:24 UTC (Sun)
by atnot (subscriber, #124910)
[Link] (5 responses)
Posted Jun 19, 2022 14:29 UTC (Sun)
by willy (subscriber, #9762)
[Link]
Posted Jun 19, 2022 14:29 UTC (Sun)
by mss (subscriber, #138799)
[Link] (3 responses)
I assume having a hash table of allowed call targets could work here (it would be incompatible with out-of-tree kernel modules, however).
But this sounds a bit like the previous CFI design that this new implementation seeks to replace.
Posted Jun 19, 2022 20:58 UTC (Sun)
by willy (subscriber, #9762)
[Link] (2 responses)
Posted Jun 19, 2022 21:32 UTC (Sun)
by mss (subscriber, #138799)
[Link] (1 responses)
I don't quite understand your analogy here, the article says:
So the checking happens prior to the actual call: in the caller, not in the callee.
Posted Jun 19, 2022 21:41 UTC (Sun)
by willy (subscriber, #9762)
[Link]
But I wasn't referring to the implementation; rather the concept is that the function declares who can call it. That's done by type here, but could also be done by saying "I am an implementation of get_block_t"
Posted Jun 19, 2022 18:49 UTC (Sun)
by iabervon (subscriber, #722)
[Link]
Posted Jun 19, 2022 21:45 UTC (Sun)
by corbet (editor, #1)
[Link] (7 responses)
Posted Jun 19, 2022 21:58 UTC (Sun)
by mss (subscriber, #138799)
[Link] (5 responses)
I think that the set of functions implementing particular callback in the kernel should be known at compile time, either via manual annotations (as willy has suggested above) or maybe even automatically by a sufficiently smart compiler.
This probably would be incompatible with out-of-tree kernel modules, however.
Posted Jun 19, 2022 22:40 UTC (Sun)
by NYKevin (subscriber, #129325)
[Link] (3 responses)
Posted Jun 20, 2022 13:51 UTC (Mon)
by khim (subscriber, #9252)
[Link] (2 responses)
Well… zero-sized arguments don't exist in standard C, they are GNU extension which means you can try to supply the patch which will support what you want to Clang and GCC. Once you left the standard it's kind of hard to expect to see such non-standard constructs supported in said standard, don't you think?
Posted Jun 20, 2022 17:39 UTC (Mon)
by nybble41 (subscriber, #55106)
[Link] (1 responses)
A keyword for the void constructor might be nice, but "(void)0" would serve well enough. This could be made into a standard VOID macro, like NULL for "(void*)0".
Posted Jun 20, 2022 20:56 UTC (Mon)
by wahern (subscriber, #37304)
[Link]
Also, at least based on a straight-forwarding reading of the standard, sequentially declared 0-length bit fields should collapse (i.e. not unspecified or undefined behavior), so that they introduce only one word of padding at most, if any; and this is indeed the behavior I see from clang and GCC. And while maybe more susceptible to disagreement, the language of the standard does seem to specify that a 0-length bit field not succeeding another bit field should not introduce any padding. I see the same behaviors for 0-length arrays, but the GCC documentation seemed much more ambiguous on both points.[2]
I am curious why I haven't seen void (the true "nothing") type semantics extended elsewhere in the grammar. Maybe 0-length bit and array fields were sufficient, if not ideal, for the most pressing scenarios. But perhaps the language (inclusive of extensions) is finally moving in a direction where the old hacks are insufficient, and void might see some more attention.
[1] See $ 3.5.2.1 at http://port70.net/~nsz/c/c89/c89-draft.txt
[2] Putting it all together after having double checked my assertions with the standard, it does seem that the only use for 0-length arrays has been almost entirely subsumed by flexible array members, except that the former make indexing notation easier (no offsetof verbiage). For anything else (mostly in relation to extensions, like 0-length structures), 0-length bit field notation seems sufficient. Maybe the situation is different with C++.
Posted Jun 19, 2022 23:29 UTC (Sun)
by corbet (editor, #1)
[Link]
Posted Jun 20, 2022 2:38 UTC (Mon)
by comex (subscriber, #71521)
[Link]
Of course, that doesn't apply to C. But it may be possible to get a similar effect with manual annotations of some sort...
A new LLVM CFI implementation
A new LLVM CFI implementation
A new LLVM CFI implementation
A new LLVM CFI implementation
A new LLVM CFI implementation
> When an indirect call is made, extra code is emitted to fetch and check this hash value prior to emitting the call itself
A new LLVM CFI implementation
A new LLVM CFI implementation
I don't quite understand what you are asking for here. The name of the called function isn't known at compile time, that's why it's an indirect call. So what name would you check against?
Checking the name
Checking the name
Checking the name
> It's a shame the standard doesn't let you write something like "void" for a zero-size argument.
Checking the name
Checking the name
Checking the name
That is essentially what the existing implementation does - that's what the jump tables contain. It requires link-time optimization to work, though, and I'm not sure what it buys over verification of the prototype.
Checking the name
Checking the name