Почему PEVerify говорит, что CLR ожидает одномерный массив для статических массивов? - PullRequest
3 голосов
/ 23 декабря 2011

Этот код не проходит проверку:

.assembly extern mscorlib {}
.assembly Program {}

.method private static void Main() cil managed
{
    .entrypoint
    .maxstack 3

    .locals init ( int32[0 ... 10] a )

    ldc.i4 10
    newarr int32
    stloc.0

    ldloc.0
    ldc.i4.0
    ldc.i4.s 32
    stelem.i4

    call string [mscorlib]System.Console::ReadLine()
    pop
    ret
}

Со следующей ошибкой:

[IL]: ошибка: [C: [...] Program.exe: :: Main] [смещение 0x0000000F] Ожидаемый одномерный массив. 1 Ошибка (ы) проверки Program.exe

Тем не менее, этот код подтверждает:

.assembly extern mscorlib {}
.assembly Program {}

.method private static void Main() cil managed
{
    .entrypoint
    .maxstack 3

    .locals init ( int32[] a )

    ldc.i4 10
    newarr int32
    stloc.0

    ldloc.0
    ldc.i4.0
    ldc.i4.s 32
    stelem.i4

    call string [mscorlib]System.Console::ReadLine()
    pop
    ret
}

Является ли это нереализованной функцией, ошибкой в ​​CLR или PEVerify или просто неправильным пониманием использования? Обе программы работают нормально.

1 Ответ

3 голосов
/ 23 декабря 2011

Мое предположение - и это только предположение - заключается в том, что это связано с различием между векторами и массивами.

Спецификация ECMA CLI (Раздел II, Разделы 14.1 и14.2) говорит следующее:

Векторы - это одномерные массивы с нулевой нижней границей.Они имеют прямую поддержку в инструкциях CIL (newarr, ldelem, stelem и ldelema).

[...]

В то время как векторы имеют прямую поддержку через CILинструкции, все другие массивы поддерживаются VES путем создания подтипов абстрактного класса System.Array.

Векторы объявляются с использованием синтаксиса T[], тогда как массивы могут объявляться различными способами с использованием T[n], T[p,q], T[x...y] и т. Д. Итак, в вашем первом примере синтаксис int32[0 ... 10] является объявлением array .Во втором примере синтаксис int32[] представляет собой объявление vector .

Я предполагаю, что верификатор возражает против вашего первого примера, поскольку он думает, что вы пытаетесь использовать newarr и stelem в массиве вместо вектора .Предположительно, верификатор только проверяет тип объявления и не учитывает ранг, границы и т. Д. Массива.Причина, по которой оба примера выполняются должным образом, заключается в том, что одномерный массив с нулевой нижней границей является вектором для всех намерений и целей.

Что касается того, почему в сообщении об ошибке указано «Ожидаетсяодномерный массив », а не« ожидаемый вектор », понятия не имею!

...