Libwebsockets首次调用lws_write时valgrind报未初始化变量分支错误
问题排查结论与修复方案
属于Libwebsockets正常特性的场景
Libwebsockets内部存在部分懒加载的全局/连接状态变量,仅在首次执行写操作时完成初始化,初始化前的读取操作会触发valgrind的未初始化值告警,这类告警属于valgrind假阳性。Libwebsockets官方维护的valgrind suppression规则文件已经覆盖了这类已知误报场景,你可以直接引入官方规则过滤这类告警。
属于初始化逻辑遗漏的排查点
- 检查
struct lws_context_creation_info结构体的初始化状态:所有未显式赋值的字段必须主动置0,未初始化的创建参数是这类告警最常见的人为诱因 - 检查首次写操作的触发时机:必须在收到
LWS_CALLBACK_CLIENT_ESTABLISHED回调后再发起写操作,未等连接完全建立就提前写会触发LWS内部读取未初始化的连接状态字段 - 检查
lws_write传入的缓冲区配置:必须按照LWS要求在缓冲区前后预留LWS_SEND_BUFFER_PRE_PADDING和LWS_SEND_BUFFER_POST_PADDING大小的空间,且预留空间需要主动置0,未初始化的预留空间会触发valgrind告警 - 检查Libwebsockets版本:低于v4.2.0的老旧版本存在TLS握手后首次写逻辑读取未初始化变量的已知bug,升级到最新稳定版即可修复
内容的提问来源于stack exchange,提问作者tbandtg
相关产品推荐
相关产品推荐

