为什么一个老 P/Invoke bool bug 在 .NET 8 才暴露:一次关于 SkipLocalsInit 优化的追查
记录一个快两年前修过的 bug。
当时 .NET 6 快要 end of life 了,我们把一个服务从 .NET 6 升级到了 .NET 8。升级之后,有用户报了一个看起来不太相关的数据异常 bug。一番略过不表的定位之后,发现问题的根源是其中一个 .NET 和 C++ 的交互面错误地使用了不同的 bool 数据长度,.NET 使用了默认的 4 字节,但是 C++ 期待的是 1 字节,因此高 3 个字节里的未初始化脏数据导致了数据异常。
不过我真正想分享的是后面多问的这一句:为什么之前没有用户报告这个问题,而且结果还挺稳定,但是升级到 .NET 8 之后,很快就有用户报了问题?到底为什么 .NET 6 下这个 bool 长度不匹配没有导致问题,但是 .NET 8 就会出问题?