Автор игры поставил кучу валидаций введенного кода на всякие разные плохие слова типа eval, на использование символа подчеркивания (с него начинаются запрещенные игроку методы map) и т.д., но забыл запретить итерацию по объекту. В итоге можно вытащить в паблик всякие прикольные методы типа removeItemFromMap. Например так:
var allmembers = "";
var underscore = null;
for (var n in map)
{
if (!underscore) // первый метод приватный
underscore = n.slice(0, 1);
allmembers += n + "; ";
}
for (var n in map)
{
if (n.slice(0, 1) == underscore)
map[n.slice(1)] = map[n];
}
Еще автор хотел заблокировать eval, setTimeout и т.п., но почему-то отдает window в качестве this. В итоге делаем, что хотим:
this ['docu' + 'ment'].GlobalMapReference = map;
var st = this ['set' + 'Timeout'];
st ("alert(docu" + "ment.GlobalMapReference.getPlayer);", 1000);
Не землю и людей, а конкретную корпорацию. Если вспомнить концовку, то часть персонала, которая была с ним согласна, стояла со стволами и провожала несогласных домой.
Насколько помню, это сам ATI халявит и не дает нормальных дров, поэтому только xf86-video-ati с напрочь урезанным 3d. Для себя решил проблему переходом на nVidia.
Такая фишка использовалась для переключения на ПЗУ TR-DOS. Кстати, в этом конкретном случае способ был вполне документирован. Переключение было, если правильно помню, при переходе по диапазону адресов, где в родном ПЗУ лежали изображения символов, т.е. данные, поэтому вызов туда был заведомо некорректным для основного ПЗУ. О смене ПЗУ на 16 кб ОЗУ не слыхал. Такое вполне реально сделать, только почти все программы этого не поддерживают.
Судя по клавиатуре и процессору и типу ПЗУ, предположу, что прошивка там также спектрумовская. Джойстик правда очень хардкорный. В те времена уже были обычные контактные джойстики на пятипиновом разъеме.
Кстати, можно тогда посмотреть на пример вашего решения данной проблемы? То есть как бы на моем месте проблему решали вы? Имеется в виду в данном конкретном случае.
Я просто пытаюсь донести, что этот код в том контексте, в котором он используется в приложении, не нуждается в дополнительных assert'ах и проверках. Без контекста и к i++ придраться можно, ибо, например, не thread-safe.
Кстати, если напишете тесты, которые покрашат hanstunnel на MIPS и ARM, будет интересно.
var allmembers = ""; var underscore = null; for (var n in map) { if (!underscore) // первый метод приватный underscore = n.slice(0, 1); allmembers += n + "; "; } for (var n in map) { if (n.slice(0, 1) == underscore) map[n.slice(1)] = map[n]; }Еще автор хотел заблокировать eval, setTimeout и т.п., но почему-то отдает window в качестве this. В итоге делаем, что хотим:
this ['docu' + 'ment'].GlobalMapReference = map; var st = this ['set' + 'Timeout']; st ("alert(docu" + "ment.GlobalMapReference.getPlayer);", 1000);Теперь смотрим единственное использование метода.
EchoHeader *header = (EchoHeader *)(sendBuffer + sizeof(IpHeader)); header->type = reply ? 0: 8; header->code = 0; header->id = htons(id); header->seq = htons(seq); header->chksum = 0; header->chksum = icmpChecksum(sendBuffer + sizeof(IpHeader), payloadLength + sizeof(EchoHeader));где IpHeader имеет размер 20 байт, а sendBuffer выделен по new в конструкторе. То есть смещение всегда четное.
Предлагаю сойтись на том, что проверки и побайтовое чтение нужны в общем случае, особенно, если код отдается как библиотека.
Кстати, если напишете тесты, которые покрашат hanstunnel на MIPS и ARM, будет интересно.
Тогда уж надо вообще всю прогу рефакторить. Только вот с таким подходом все время уйдет на один сплошной рефакторинг.