C 结构成员可能未初始化
我目前正在为ESP8266编写WebSocket守护程序。我目前正在努力解决一个无法解释的错误。我定义了一个结构来保存WebSocket框架的所有信息C 结构成员可能未初始化,c,gcc,struct,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; 然后,我按照中所
typedef struct {
uint8_t flags;
uint8_t opcode;
uint8_t isMasked;
uint64_t payloadLength;
uint32_t maskingKey;
char* payloadData;
} WSFrame;
然后,我按照中所述解析消息。因为我是服务器,所以我需要取消数据的掩码。同样,这个方法在这里非常有用。但是,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);
即使在parseWSFrame
中定义了frame.maskingKey
我监督什么?为什么它抱怨“frame.maskingKey”
,但却提到了初始化中的错误
如果我做frame.maskingKey=0代码>在定义WSFrame之后代码>,编译器将关闭。但是,我不能声明uint32\u t maskingKey=0;在我的结构定义中
我不想使用任何堆分配,所以我不想malloc任何东西。我认为这里的主要问题是编译时的-Werror
标志,它将警告视为错误。如果您仍然希望保留该编译器标志,那么最好将frame.maskingKey
初始化为0
,就像您所做的那样
不允许在结构声明中初始化结构成员。因此,在结构声明中不可能执行uint32\u t maskingKey=0
。什么是parseWsFrame()
函数?为什么不这样初始化结构:WSFrame frame=frame\u INIT
其中FRAME_INIT
是#define FRAME_INIT{0,0,0,0,0,0}
我使用{0,0,0,0,0,0}
而不是{0}
,因为如果使用最后一个编译器,某些编译器仍然不会关闭。maskingKey
是在WSFrame中有条件地初始化的,由于并不总是需要它,因此可能存在通过parseWsFrame()
的代码路径,其中frame.maskingKey
可能无法设置?换句话说,可能它通常是初始化的,但在某些情况下它可能不是,并且编译器足够聪明来识别它?@chuck258但是,考虑到您发布的代码,frame.maskingKey
总是需要的,即使unmaskWsPayload()
有条件地选择不使用它,因为它是通过值传递给unmaskWsPayload()
,并且编译器注意到它正在传递一个可能的随机/垃圾值作为参数…这对c正常吗?我确实想要-Werror标志,但这似乎是不必要的代码复制如果你想要-Werror标志,你必须初始化帧。maskingKey
或整个帧,正如@Jack所说的那样