我的一个 friend 正在浏览 this open-source SSL code在处理 SHA 加密的函数中,注意到这个奇怪的片段:
ctx->total[0] += (uint32_t) ilen; // ilen is of type size_t
ctx->total[0] &= 0xFFFFFFFF;
if( ctx->total[0] < (uint32_t) ilen )
ctx->total[1]++;
关于这段代码,我们无法弄清楚两件事。首先,它将 ctx->total[0]
(uint32_t
类型)与 0xFFFFFFFF
进行 AND 运算,这不应该执行任何操作。在二进制中,这是与所有 1
的 AND 运算,它应该产生相同的值。那么,在我看来,这两行是相同的:
ctx->total[0] &= 0xFFFFFFFF;
ctx->total[0] = ctx->total[0];
如果我是对的,为什么会有这条线?一些安全原因?如果我错了,怎么错的以及为什么?
其次,假设 AND 不执行任何操作,我们不明白 if
何时会为真。如果 AND 什么都不做,那么 if
本质上是:
if (ctx->total[0] < ctx->total[0])
这永远不会是真的。我们缺少什么?
如果您想查看头文件以说服自己 ctx->total[0]
是 uint32_t
类型,或者出于任何其他原因,您可以找到那here .
此外,我的第一个疯狂猜测是当我们将 ilen
从 size_t
转换为 uint32_t
时发生了一些偷偷摸摸的事情,但我仍然陷入困境和困惑。
最佳答案
第一个问题:
你是对的,32 位不需要这个 &ing,我的猜测是 - 他们试图防止 ctx->total[0]
不是 32 位的情况(所以即使有人将更改它,否则即使对于 uint32_t 类型,平台也将具有 64 位),因此使用此代码,他们 100% 确定,没有 99.99999% :)
第二个问题很简单:
检查此代码如何处理值 ctx->total[0] == 0xFFFFFFFF
和 ilen == 1
ctx->总[0] += (uint32_t) ilen;//这会溢出并且 total[0] 现在为 0
if( ctx->total[0] < (uint32_t) ilen ) // 0<1 true
ctx->total[1]++;
关于c - 为什么 AND 一个带有 0xFFFFFFFF 的 uint32 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500687/