-
Notifications
You must be signed in to change notification settings - Fork 401
Description
问题描述
当 Protobuf 枚举定义中包含值为 -1 的枚举项时,在哈希表扩容(resize)后,该枚举项有概率会丢失,原因是和PBT_DEADKEY此时恰好相等
复现步骤
- 定义包含枚举值 -1 的 Protobuf 消息:
enum Common
{
COMMON_NONE = 0;
val1 = 20;
val2 = 63;
val3 = 801;
val4 = 255;
val5 = -1; // 这个值会丢失
val6 = 25;
val7 = 256;
val8 = 99;
val9 = 50;
}- 加载并遍历枚举字段:
local ok, err = pb.loadfile("msg.pb")
if not ok then
print("loadfile pb error:", err)
return
end
for field_name, number, type, default_value, label, oneof_name, oneof_index in pb.fields(".Common.Common") do
print("field_name:", field_name, " number:", number)
end- 结果:
val5(值为 -1) 不会被遍历到
输出结果如下:
field_name: val3 number: 801
field_name: val9 number: 50
field_name: val8 number: 99
field_name: val1 number: 20
field_name: val6 number: 25
field_name: val2 number: 63
field_name: val7 number: 256
field_name: val4 number: 255
断点debug查看field_tags发现此时val5已经丢失:
0x00000233f412c9b0 0x00000233f4134390 00000233f4117f60 COMMON_NONE
0x00000233f412c9b0 + 0x181 0x00000233f4134408 00000233f4117420 val3
0x00000233f412c9b0 + 0x182 0x00000233f41344f8 00000233f4117c00 val9
0x00000233f412c9b0 + 0x183 0x00000233f41344d0 00000233f41174e0 val8
0x00000233f412c9b0 + 0x184 0x00000233f41343b8 00000233f41170c0 val1
0x00000233f412c9b0 + 0x185 0
0x00000233f412c9b0 + 0x186 0
0x00000233f412c9b0 + 0x187 0
0x00000233f412c9b0 + 0x188 0
0x00000233f412c9b0 + 0x189 0x00000233f4134480 00000233f4117cc0 val6
0x00000233f412c9b0 + 0x1810 0
0x00000233f412c9b0 + 0x1811 0
0x00000233f412c9b0 + 0x1812 0
0x00000233f412c9b0 + 0x1813 0x00000233f41343e0 00000233f4117480 val2
0x00000233f412c9b0 + 0x1814 0x00000233f41344a8 00000233F41175A0 val7
0x00000233f412c9b0 + 0x18*15 0x00000233f4134430 00000233f41179c0 val4