3 ms·
sizeof(struct foo) is required to return the actual size, including padding, so struct foo foo_inst; memset(&foo_inst, 0, sizeof(foo_inst)); will certainly re
by shawxe 6y ago
sizeof(struct foo) is required to return the actual size, including padding, so
struct foo foo_inst;
memset(&foo_inst, 0, sizeof(foo_inst));
will certainly result in all padding bytes being set to zero.
- saagarjha 6y agosizeof will include padding, but there is no need for memset to actually perform a write that cannot be consistently observed.
- deleted 6y ago[deleted]
- icedchai 6y agoAre you saying memset does not have to write the entire struct? I understand it can be optimized out, but thought it if it was actually executed it had to set all of the specified bytes.
- saagarjha 6y agomemset must write to the bytes that underly the members of the struct. What it does to padding bytes is not of consequence to you, as you cannot observe it as far as I understand. (That is, if you tried to read it out it would not necessarily be the value you had memset, or even be consistent across reads.)
- icedchai 6y agomemset definitely writes to padding bytes, as noted by several other folks here. you observe these padding bytes during serialization and deserialization (disk, network, memory mapped buffer, etc.) Note this is important enough that compiler folks consider it a bug if it doesn't work correctly. see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92486 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92486 for a recent example involving memset and memcpy.
- saagarjha 6y agoAs mentioned in the bug report, the value of padding bytes is unspecified by the C standard. Actually, according to the linked Defect Report mentioned in the bug, there is a bit of discussion on whether the functions you mentioned should be entirely undefined to call or if some exceptions should be carved out. If the functions are legal to call, it is very likely that the results will be some arbitrary reification of the unspecified value.
- icedchai 6y agoThere is some discussion of that, but it is wrong. There are many comments there, so you should read the whole bug report. The value of the padding bytes must be what is specified in memset.
- adrianN 6y agoReading padding bytes is UB, so the compiler could choose to optimize that memset call so that the padding bytes aren't touched.