【问题标题】:MethodImpl(NoOptimization) on this method, what does it do? And is it really nessecary?MethodImpl(No Optimization) 在这个方法上,它有什么作用?真的有必要吗?
【发布时间】:2013-12-08 01:20:59
【问题描述】:

好吧,我想对密码进行哈希处理,我查看了 ASP.net Identity 在Microsoft.AspNet.Identity.Crypto 类中的作用,然后我找到了这个函数(用于比较 2 个密码哈希):

[MethodImpl(MethodImplOptions.NoOptimization)]
private static bool ByteArraysEqual(byte[] a, byte[] b)
{
    if (object.ReferenceEquals(a, b))
    {
        return true;
    }
    if (((a == null) || (b == null)) || (a.Length != b.Length))
    {
        return false;
    }
    bool flag = true;
    for (int i = 0; i < a.Length; i++)
    {
        flag &= a[i] == b[i];
    }
    return flag;
}

这是反射器输出的直接副本...

现在我的问题是,NoOptimization 属性有什么好处,为什么它应该在那里(如果我删除它会发生什么)?对我来说,在 for-loop 之前,它看起来像是默认的 Equals() 实现。

我试图看一下 IL,但这对我来说都是无稽之谈:/

【问题讨论】:

    标签: c# optimization cil


    【解决方案1】:

    如果“智能”编译器将该函数转换为在发现不匹配后立即返回 false 的函数,它可能会使使用该函数的代码容易受到“定时攻击”——攻击者可以想象得出其中字符串中的第一个不匹配取决于函数返回的时间。

    实际上,这不仅仅是科幻小说,尽管看起来确实如此。即使有互联网的障碍,如果您猜测实施短路,您也可以获取大量样本并使用一些统计数据来弄清楚发生了什么。

    【讨论】:

    • 感谢您,出于性能原因,我自己经常使用提前终止循环,但我从没想过它可以攻击!干杯!
    • 感谢您提供这个非常有趣的答案。只是想知道为什么没有优化循环以在值为 false 时停止。很好的答案!
    • @tmyklebu 非常正确,现在正如您所描述的那样,一个可怕的突出漏洞在现代 CPU 的基础分支预测机制上起作用。请参阅spectreattack.com/spectre.pdf大约在第 10 页左右(PDF 第 11 页)。
    【解决方案2】:

    也可能存在 JIT 编译器

    1. 在优化过程中出现错误或
    2. 代码优化可能会产生错误,因为它以某种意想不到的方式优化代码。

    我遇到过优化方法与非优化方法的行为不同的情况。 (我相信这是上面的案例 A)。仅将一种方法声明为

        [MethodImpl(MethodImplOptions.NoOptimization)]
    

    解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 2018-04-05
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多