(2015-10-11 17:11:11 отредактировано dayznse)

Оптимизация при компиляции или особенность адресации Code ключей?

Прошу прощения, если вопрос окажется не совсем по теме ключей.

Я решил посмотреть как срабатывает Out of memory, и можно ли загружать RAM ключа "до упора". Написал такую тестовую программку для загружаемого кода:

extern struct
{
    BYTE abRWBuff[256];
} iodata ALIGNED;

int f1 (int q); // прототип

int f1 (int q)
{
    volatile int i;
    char b[99000];  // Массив больше предусмотренной памяти
    b[98777] = 100;   // Пишем по адресу, который выходит за размер RAM
    
    GcaLedOff(0);
    for (i = 0; i < 900000; i++); // Все хорошо - Подмигиваем
    GcaLedOn(0);
    
    return (b[98777] + q); // Возврат (100+q)
}

DWORD main(DWORD dwInDataLng, DWORD dwOutDataLng, DWORD dwP1)
{
    return f1(7);     // Возврат значения 107
}

Как оказалось, данная программа успешно выполняется.

Это связано с тем, что компилятор как-то оптимизирует исходный код, или с какими-то особенностями внутренней кухни Code-ключа?

Re: Оптимизация при компиляции или особенность адресации Code ключей?

Здравствуйте!
Умный компилятор оптимизирует данный код, инициализируя только одно значение из массива char b[99000], т.к. остальные значения не используются в примере. Получить ошибку GrdE_gcException (90) можно при попытке взять адрес элемента массива b[98777], так как в этом случае компилятор не сможет проигнорировать его (массива) размер. Рекомендуем инициализировать все элементы массивов (хотя бы нулями memset(&b, 0, sizeof(b)), чтобы быть уверенным, что они не выходят за границы ОЗУ или стека.