已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
上个月关门了。
Improve this question
我正在查看BoringSSL OPENSSL_malloc实现,我在这里看到了一个非常奇怪的代码:
我看到OPENSSL_MALLESS_PREFIX被定义为8,那么为什么他们把条件if(size + OPENSSL_MALLESS_PREFIX < size),因为它在技术上永远不会为真?
还有,他在评论中说的“链接器丢弃了标签”或“在写的时候优化了引用”是什么意思?
下面是我从哪里得到的源代码:https://github.com/google/boringssl/blob/master/crypto/mem.c#L132
1条答案
按热度按时间wztqucjr1#
我看到OPENSSL_MALLESS_PREFIX被定义为8,那么为什么他们把条件if(size + OPENSSL_MALLESS_PREFIX < size),因为它在技术上永远不会为真?
这可能是真的假设
size_t
是uint64_t的typedef;按sizeof(uint64_t)==8
计算是合理的。如果请求分配的字节数(size
变量)大于UINT64_MAX - 8
,则此变量将回绕,就像size_t以补码2格式存储一样。这在语言标准中有很好的定义。注意已分配字节数存储的位置。kBoringSSLBinaryTag
:注意它是一个静态变量,即它对于翻译单元是本地的。只要它满足as-if规则,则编译器可以自由地优化它,内联它。然而,将它的地址视为volatile并取消引用它,迫使编译器将读出视为副作用,或者换句话说:它迫使编译器假设变量可能已通过常规控制流以外的方式更改,从而有效地防止变量被优化掉。请注意,注解非常明确地说明了这些字节的用途:
长话短说,这是一种强制编译器和链接器将该数组嵌入二进制文件中某处的方法,而不需要定义一个公共可访问的符号,即而不会使API与之混淆。