可变长度数据和零长度数组的二进制序列化是否安全?

时间:2012-04-04 21:34:51

标签: c++ c serialization

我做了一些研究,但未能找到明确的批准或反对。

我想要的是一个固定大小的结构+可变长度的部分,这样序列化可以用简单且不易出错的方式表达。

struct serialized_data
{
    int len;
    int type;
    char variable_length_text[0];
};

然后:

serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5);
buff->len=5;
buff->type=1;
memcpy(buff->variable_length_text, "abcd", 5);

不幸的是,我无法找到MSVC,GCC,CLang等等。

也许有更好的方法来实现同样的目标?

我真的不想要那些丑陋的演员:

memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5);

1 个答案:

答案 0 :(得分:2)

该程序使用零长度数组。这不是C而是GNU扩展。

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

C89中的一个常见习语,称为 struct hack ,用于:

struct serialized_data
{
    int len;
    int type;
    char variable_length_text[1];
}; 

不幸的是,它作为灵活阵列的常见用途并不严格符合要求。

C99附带类似于执行相同任务的东西:一个名为灵活数组成员的功能。 以下是标准(C99,6.7.2.1p17)

的一个例子
struct s { int n; double d[]; };
int m = 12;  // some value
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));