MethodImpl (NoOptimization) по этому методу, что он делает? И это действительно неудобно?

Ну, я хотел хэшировать пароль, и я посмотрел, как 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 подходит для, и почему он должен быть там (что произойдет, если я его удалю)? Для меня это выглядит как реализация по умолчанию Equals() до for -loop.

Я попытался взглянуть на IL, но для меня все это чушь:/

Ответ 1

Если "умный" компилятор превратил эту функцию в то, что возвращает false, как только обнаружено несоответствие, он может сделать код, используя эту функцию, уязвимой для "временной атаки" --- злоумышленник может мыслить где первое несоответствие в строке было основано на том, сколько времени потребовалось для возврата функции.

Это не просто научная фантастика, на самом деле, хотя может показаться, что она есть. Даже в Интернете на этом пути вы можете взять целую кучу образцов и использовать некоторые статистические данные, чтобы выяснить, что происходит, если у вас есть предположение, что реализация коротких замыканий.

Ответ 2

Также могут быть случаи, когда JIT-компилятор либо

  • Произошла ошибка в процессе оптимизации или
  • Оптимизация кода может привести к ошибке, поскольку она оптимизирует код каким-то неожиданным способом.

Я столкнулся с ситуациями, когда оптимизированный метод вел себя иначе, чем не оптимизированный. (Я считаю, что это был случай А сверху). Объявление только одного метода как

    [MethodImpl(MethodImplOptions.NoOptimization)]

решил проблему.