[Flac-dev] 64-bit FLAC structure sizes and padding

Erik de Castro Lopo
2011-05-30T07:20:11Z

Jerker B?ck wrote:

> Erik, thanks for the swift answer. Your right, I haven't seen any
issues
> yet. But it a thought stroke me when implementing edit capabilities of FLAC
> vorbis comments. I've already implemented reading vorbis comments from
FLAC
> files in 64-bit and it works without any issues. This now leave me a bit
> confused, since it should have issues(!).

No it shouldn't, at least not if FLAC was well designed and from
everything I've seen, FLAC is well designed.

> Using the MS 64-bit compiler on Windows 7/2008R2 64-bit. Static libFLAC
> compiled with compiler default 8 byte boundary alignment.
>
> Now consider this:
>
> typedef struct {
>     FLAC__uint32 length;
>     FLAC__byte *entry;
> } FLAC__StreamMetadata_VorbisComment_Entry;
>
> The compiler (with default settings) should interpret this as
>
> typedef struct {
>     FLAC__uint32 length;
>     uint32_t __padding;
>     FLAC__byte *entry;
> } FLAC__StreamMetadata_VorbisComment_Entry;
>
> Sizeof structure: 32-bit - 8 bytes, 64-bit - 16 bytes
>
> How on earth does the compiler find entry correctly when reading (it does,
> but how)?

The compiler figures this out because the platform ABI [0]
specifies how much padding there is and all compilers should
follow the platform ABI.

Furthermore, the structs above are *only* for communication
between the client application and the library. Those structs
are not actually used to store data in a FLAC file.

HTH,
Erik

[0] https://secure.wikimedia.org/wikipedia/en/wiki/Application_binary_interface
--
----------------------------------------------------------------------
Erik de Castro Lopo