我的一个朋友在处理 SHA 加密的函数中查看这个开源 SSL 代码,并注意到这个奇怪的片段:
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
,它不应该做任何事情。在二进制中,这是与所有1
s 的 ANDing,它应该产生相同的值。那么,在我看来,这两行是相同的:
ctx->total[0] &= 0xFFFFFFFF;
ctx->total[0] = ctx->total[0];
如果我是对的,为什么这条线在那里?一些安全原因?如果我错了,如何以及为什么?
if
其次,假设 AND 没有做任何事情,我们不知道什么时候会是真的。如果 AND 什么都不做,那么if
本质上就是:
if (ctx->total[0] < ctx->total[0])
这不应该是真的。我们缺少什么?
如果您想查看头文件以说服自己ctx->total[0]
是 type uint32_t
,或者出于其他任何原因,您可以在此处找到。
另外,我的第一个疯狂猜测是,当我们ilen
从size_t
to施法时,发生了一些鬼鬼祟祟的事情uint32_t
,但我仍然感到困惑和困惑。