Skip to content

Предоставленные файлы

VBrazhnik edited this page Jan 3, 2019 · 1 revision

На странице проекта «Corewar» приведены ссылки для скачивания следующих файлов:

Архив vm_champs.tar

В этом архиве можно найти скомпилированный исполняемый файл виртуальной машины corewar, скомпилированную программу-транслятор asm, а также множество чемпионов в виде .s и .cor файлов.

Транслятор asm

В задании проекта сказано, что программа asm переводит код из языка ассемблера, записанного в .s файле, в байт-код, который должен быть помещен в файл с расширением .cor.

Но на самом деле предоставленная программа не обращает никакого внимания на расширения входящих файлов. Она лишь ищет последнюю точку в имени и заменяет всё дальнейшее его содержимое расширением .cor.

Вопрос «Насколько можно назвать такой подход оптимальным?» остается открытым.

Ведь это делает возможными следующие ситуации, которые хоть и не являются ошибками в привычном понимании, но все же нарушают заявленный workflow:

$ ./asm batman.cor
Writing output program to batman.cor
$ ./asm batman
Writing output program to .cor
$ ./asm dc.heroes/batman
Writing output program to dc.cor

Также предоставленная программа никак не ограничивает количество принимаемых на обработку чемпионов.

Поэтому за один раз в качестве аргументов можно указать множество файлов с самыми разными расширениями. Правда, обработан будет только последний из них:

$ ./asm ant-man.s iron_man.s batman.s
Writing output program to batman.cor

Все остальные аргументы asm игнорирует:

$ ./asm --undefined-flag incorrect_file.s batman.s
Writing output program to batman.cor

Как с этим жить?

Поскольку в тексте задания подобное поведение не описано, в собственной реализации можно ограничить количество принимаемых аргументов всего одним файлом, который гарантировано должен иметь расширение .s.

Это сделает работу asm более прозрачной и ликвидирует приведенные выше уязвимости в workflow.

Кстати, виртуальная машина также не проверяет входящие файлы на наличие расширения .cor.

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

Чемпионы

Также имеются проблемы с предоставленными примерами чемпионов.

К сожалению, не все файлы были написаны корректно. Поэтому часть из них программа asm не сможет транслировать в байт-код и выдаст ошибку.

Как с этим жить?

В такой ситуации стоит учитывать, что с файлами из папки champs/examples проблем не возникнет, а вот в работоспособности остальных предстоит убедиться лично.

Файлы op.c и op.h

В файле op.c находиться структура, которая описывает каждую операцию, определенную в языке ассемблера.

Приведенные в этой структуре данные мы можем перезаписать в любой удобной для нас форме и поместить в проект. Никаких ограничений в данном случае не установлено.

Также нам предоставляется заголовочный файл op.h. В нем содержатся важные константы препроцессора, которые определяют параметры работы виртуальной машины, а также синтаксис ассемблера.

С этим файлом стоит обращаться более бережно и включить в проект таким, какой он есть. Внеся лишь самые необходимые изменения.

Поскольку для участия в проекте «Corewar Championship» его наличие является одним из условий:

It will be executed on our own virtual machine, so the configuration will be the one you will describe in your file op.h that will be attached.

Необходимыми изменениями, которые обязательно нужно выполнить над данным файлом, является его приведение в соответствие с Norm'ой. Поскольку предоставленный файл не соответствует установленным правилам форматирования и Norminette при его проверке выдаст ряд предупреждений о найденных ошибках.

Если же участие в соревновании «Corewar Championship» не запланировано, то о судьбе файла op.h беспокоиться не стоит. В данном случае с ним можно проводить любые, даже гораздо более серьезные изменения, чем простое приведение к Norm'е.