struct成员可能未初始化

时间:2015-02-26 20:04:36

标签: c gcc struct

我正在为ESP8266编写WebSocket守护进程。我目前正在努力解决一个我无法解释的错误。我定义了一个结构来保存WebSocket框架的所有信息

typedef struct {
    uint8_t flags;
    uint8_t opcode;
    uint8_t isMasked;
    uint64_t payloadLength;
    uint32_t maskingKey;
    char* payloadData;
} WSFrame;

然后按照IEEE RFC6455 sec 5.2中的描述解析消息。然后我需要取消屏蔽数据,因为我是服务器。同样,IEEE RFC6455 sec 5.3在这里非常有用。但是,xtensalx106的编译器给出了以下错误:

user/websocketd.c: In function 'wsRecvCb':
user/websocketd.c:104:11: error: 'frame.maskingKey' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   WSFrame frame;
           ^
cc1: all warnings being treated as errors

以下代码:

WSFrame frame;
parseWsFrame(data, &frame);

os_printf("payloadLength=%"PRIu64"\n", frame.payloadLength);
unmaskWsPayload(frame.payloadData, frame.payloadLength, frame.maskingKey);

即使frame.maskingKey中定义了parseWSFrame

我应该监督什么?为什么它对'frame.maskingKey'抱怨,但确实提到错误是在初始化中?

如果我在frame.maskingKey = 0;的定义之后立即执行WSFrame frame;,则编译器会关闭。但是,我不能声明uint32_t maskingKey = 0;在我的结构定义中。

我不想使用任何堆分配,所以我不想malloc任何东西。

1 个答案:

答案 0 :(得分:1)

我认为这里的主要内容是编译时-Werror标志,它将警告视为错误。如果您仍想保留该编译器标志,则最好将frame.maskingKey初始化为0,就像您一样。

永远不允许在结构声明中初始化结构成员。因此在结构声明中不可能做uint32_t maskingKey = 0