6 ms·
memset, sure, then you copy the struct (return it or pass it by value) and the compiler won't bother copying the padding bytes. Or worse, an optimizing compiler
by scatters 7y ago
memset, sure, then you copy the struct (return it or pass it by value) and the compiler won't bother copying the padding bytes. Or worse, an optimizing compiler will see that you're writing to padding bytes and helpfully no-op it.
- kazinator 7y agoA compiler that optimizes away memset is not one that could be used for targeting anything that sits on a network.
- saagarjha 7y agoThat immediately rules out GCC and Clang…
- kazinator 7y agoI don't think so, unless we're mistaking memset for __builtin_memset.
- scatters 7y agoGCC treats the two identically. See https://github.com/gcc-mirror/gcc/blob/229c0ef777161ec5adfb71ef1611af502541ccda/gcc/builtins.def#L93 https://github.com/gcc-mirror/gcc/blob/229c0ef777161ec5adfb7...
- kazinator 7y agoI see; because the sixth argument (BOTH_P) in that macro call is true.
- shawxe 7y agoFirst of all, there is no way the compiler is going to optimize a call to memset(&foo, 0, sizeof(foo)) when &foo is being interpreted as a void pointer. That doesn't even make sense. Second of all, in a generic C interface keys are likely to be treated as void pointer and almost certainly are going to be moved around with memcpy etc. rather than returned/passed by value since doing so would make the interface non-generic.
- dependenttypes 7y agoThe HN markdown ate your stars.
- scatters 7y agoThe compiler knows what memset does. One of the earliest steps of optimization is replacing calls to well-known functions with intrinsics. Try it! https://godbolt.org/z/QUREQi https://godbolt.org/z/QUREQi Yes, it's true that generic C code will type-erase the key type. However it just takes a little refactoring in specific code to move the struct initialization across a call boundary from where it is passed to the generic code.
- kazinator 7y agoThe compiler knows that memset clobbers an object, and can classify that as a dead store. I'm skeptical about compilers optimizing memset not to cover padding between structure members. Firstly, that would introduce security holes into a heck of a lot more existing code compared to code that uses a dead-store memset to wipe sensitive crypto. Secondly, it wouldn't run any faster. Gaps in a structure and at the end exist in order to eliminate misalignment. Before most padding, there is a member that ends on a misaligned address. It's slower to update just that member, and leave the padding alone, than to clobber the padding. For instance if we have a { char a; int b; char c; } structure, we gain nothing by zeroing just one byte of a, b and c. In some compiler for an 8 bit system, this reasoning is likely false; I will worry about it when porting to that. Very little existing code will fit; you're coding from scratch for such things.