Lobsters | 原文链接 | 2026-08-31 收录

排查 BPF 中的类型别名分析优化:一个 ToS 字节引发的错误

来源: loshz.com — 2026-02-28

概述

作者在把 BPF 程序改用 BTF 生成的 vmlinux.h 头后,集成测试开始因丢包而失败——tcpdump 显示坏 L3 校验和。追踪发现,代码更新 IP 头的 ToS 字段后需重算校验和,需先读旧 16 位词、写新值后再读新 16 位词来计算增量。但反汇编显示,clang 因「严格别名规则」(uint16_t* 与 struct iphdr* 是不同类型)错误地认为写 iph->tos 不会改变 (uint16_t*)iph 指向的内存,从而优化掉了第二次读取。进一步发现 CO-RE 的 preserve_access_index 属性掩盖了 GEP 偏移重叠,让别名分析失效。改用 READ_ONCE 强制重读内存即修复。

核心要点

金句

因为 Clang 认为底层 16 位整数没有被 struct 赋值修改(实际上改了),它激进地优化掉了第二次内存读取。
返回 Lobsters 首页