Description
In libbson/src/bson/bson-macros.h, it appears that for GCC, instead of:
# define BSON_ALIGNED_BEGIN(_N)
|
# define BSON_ALIGNED_END(_N) __attribute__((aligned (_N))) |
We should use:
# define BSON_ALIGNED_BEGIN(_N) __attribute__((aligned (_N)))
|
# define BSON_ALIGNED_END(_N) |
I noticed this because I was unable to declare the array
bson_iter_t b[1];
|
// Checking size, expecting "bson_iter_t: 128"
|
printf( "\nbson_iter_t: %zu\n", sizeof(bson_iter_t) ); // Output "bson_iter_t: 80" |
Example:
#include "bson.h"
|
|
|
// Example definition for bson_iter_t:
|
//
|
// BSON_ALIGNED_BEGIN (128)
|
// typedef struct
|
// {
|
// const uint8_t *raw; /* The raw buffer being iterated. */
|
// uint32_t len; /* The length of raw. */
|
// uint32_t off; /* The offset within the buffer. */
|
// uint32_t type; /* The offset of the type byte. */
|
// uint32_t key; /* The offset of the key byte. */
|
// uint32_t d1; /* The offset of the first data byte. */
|
// uint32_t d2; /* The offset of the second data byte. */
|
// uint32_t d3; /* The offset of the third data byte. */
|
// uint32_t d4; /* The offset of the fourth data byte. */
|
// uint32_t next_off; /* The offset of the next field. */
|
// uint32_t err_off; /* The offset of the error. */
|
// bson_value_t value; /* Internal value for various state. */
|
// } bson_iter_t
|
// BSON_ALIGNED_END (128);
|
|
|
|
|
// Incorrectly defined type Bar
|
typedef struct |
{
|
char c; |
int i; |
} Bar __attribute__((aligned(128)));
|
|
|
|
|
// Correctly defined type Foo
|
typedef struct __attribute__((aligned (128))) |
{
|
char c; |
int i; |
} Foo;
|
|
|
int main (int argc, char *argv[]) |
{
|
|
|
printf( "bson_t: %zu\n",sizeof(bson_t ) ); // Output: "bson_t: 128" |
// printf( "bson_t[1]: %zu\n",sizeof(bson_t[1] ) ); // GCC 5.2.1 compiler error: alignment of array elements is greater than element size
|
|
printf( "\nbson_iter_t: %zu\n",sizeof(bson_iter_t ) ); // Output "bson_iter_t: 80" |
// printf( "bson_iter_t[1]: %zu\n",sizeof(bson_iter_t[1]) ); // GCC 5.2.1 compiler error: alignment of array elements is greater than element size
|
|
|
printf( "\nBar: %zu\n",sizeof(Bar) ); // Output: "Bar: 8" |
// printf( "Bar[1]: %zu\n",sizeof(Bar[1]) ); // GCC 5.2.1 compiler error: alignment of array elements is greater than element size
|
|
printf( "\nFoo: %zu\n",sizeof(Foo) ); // Output: "Foo: 128" |
printf( "Foo[1]: %zu\n",sizeof(Foo[1]) ); // Output: "Foo[1]: 128" |
|
|
return 0; |
}
|
*****
I would appreciate it if you could still include me in the bug hunt for 3.2 even though I'm technically 1 day past the deadline ... I tried to write it up nice to win you guys over!! Happy Hunting!!