Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MethodImpl(NoOptimization)在这个方法上,它做什么?真的是卡里吗?_C#_Optimization_Cil - Fatal编程技术网

C# MethodImpl(NoOptimization)在这个方法上,它做什么?真的是卡里吗?

C# MethodImpl(NoOptimization)在这个方法上,它做什么?真的是卡里吗?,c#,optimization,cil,C#,Optimization,Cil,嗯,我想散列一个密码,我看了一下ASP.net Identity在Microsoft.AspNet.Identity.Crypto类中是如何工作的,我使用了这个函数(用于比较两个密码散列): [MethodImpl(MethodImplOptions.NoOptimization)] 专用静态bool ByteArraysEqual(字节[]a,字节[]b) { if(object.ReferenceEquals(a,b)) { 返回true; } 如果((a==null)| |(b==null

嗯,我想散列一个密码,我看了一下ASP.net Identity在
Microsoft.AspNet.Identity.Crypto
类中是如何工作的,我使用了这个函数(用于比较两个密码散列):

[MethodImpl(MethodImplOptions.NoOptimization)]
专用静态bool ByteArraysEqual(字节[]a,字节[]b)
{
if(object.ReferenceEquals(a,b))
{
返回true;
}
如果((a==null)| |(b==null))| |(a.Length!=b.Length))
{
返回false;
}
布尔标志=真;
for(int i=0;i
这是反射器输出的直接副本

现在我的问题是,NoOptimization属性对有什么好处,为什么它会出现(如果我删除它会发生什么情况)?在我看来,它看起来像一个默认的Equals()实现,直到
for
-循环

我试图查看IL,但这对我来说毫无意义:/

如果“智能”编译器在发现不匹配时立即将该函数转换为返回
false
的函数,则使用该函数的代码可能容易受到“定时攻击”---攻击者可以根据函数返回所用的时间确定字符串中第一个不匹配的位置


事实上,这不仅仅是科幻小说,尽管它看起来像科幻小说。即使有了互联网,如果您猜测实现短路,您也可以采集大量样本并使用一些统计数据来了解发生了什么。

也可能存在JIT编译器出现以下情况的情况

  • 其优化过程中存在错误或
  • 代码优化可能会产生错误,因为它以某种意外的方式优化代码
  • 我遇到过优化方法与非优化方法行为不同的情况。(我相信这是上面的一个案例)。只声明一个方法为

        [MethodImpl(MethodImplOptions.NoOptimization)]
    

    解决了这个问题。

    谢谢你,我自己经常因为性能原因而使用提前终止循环,但我从来没有想过它是可攻击的!干杯谢谢你这个非常有趣的回答。我只是想知道为什么循环没有优化到在值为false时停止。回答得好@tmyklebu非常正确,现在,正如您在分支预测机制上所描述的那样,一个可怕的突出的漏洞正在发挥作用,分支预测机制是现代CPU的基础。参见第10页左右(PDF第11页)。
        [MethodImpl(MethodImplOptions.NoOptimization)]