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

Binary serialization of variable length data and zero length arrays, is it safe?

本文关键字:序列化 二进制 是否 安全 数据 数组      更新时间:2023-10-16

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

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

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);

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

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

C89 中一个常见的习语,称为结构体黑客,是使用:

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]));