为什么AND和uint32值为0xFFFFFFFF?

时间:2013-10-21 17:10:59

标签: c bit-manipulation

我的一位朋友正在通过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,它们不应做任何事情。在二进制文件中,这与所有1 s进行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

此外,我的第一个猜测是,当我们ilensize_t投射到uint32_t时,会发生一些偷偷摸摸的事情,但我仍然感到困惑和困惑。

2 个答案:

答案 0 :(得分:9)

第一个问题:

你是对的,32位不需要这个&amp; ing,我的猜测是 - 他们试图阻止ctx->total[0]不是32位的情况(所以即使有人会改变它,平台也会有64位甚至uint32_t类型),所以使用这段代码,他们100%肯定,没有99.99999%:))

第二个问题很简单:

检查此代码对值ctx->total[0] == 0xFFFFFFFFilen == 1

的效果

ctx->total[0] += (uint32_t) ilen; // this will overflow and total[0] now 0

if( ctx->total[0] < (uint32_t) ilen ) // 0<1 true
    ctx->total[1]++;

答案 1 :(得分:4)

if基本上是这样做的:

if (ctx->total[0] + (uint32_t) ilen < (uint32_t) ilen)
    ctx->total[1]++;

即。如果将ilen添加到ctx->total[0]会导致溢出,请点击ctx->total[1]。换句话说,它正在执行添加的进位