вторник, 10 июня 2014 г.

Как изучать чужой код

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

Во-первых, для того, чтобы изучить программу нужны исходники. О том, как исследовать программу без исходников ищите другие материалы в статьях по хакерство.
 
Во вторых, нужна какая-никакая документация и/или человек, который с этой программой работал. В моем случае, документации практически не было. Был только человек модификатор кода, который работал над ним приблизительно год назад. Но самой главной проблемой было то, что работать я начала из дома, а человек был в офисе. А по телефоны бывает очень трудно понять, что не так работает. Сперва я думала, что сходу со всем разберусь. Но в результате, только устанавливала систему я неделю, а еще недели три пыталась запустить клиента под необходимой средой разработки с надлежащими установками компилятора.

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

Еще один путь изучения программы я прочитала у Макконнелла. Он предлагал сесть вечерком и читать код программы как увлекательный роман. Я так делала, распечатала несколько заголовочных файлов и уткнулась в незнание английского. Впоследствии я стала читать листинги с планшета, попутно заходя в переводчик, чтобы узнать значения новых для меня слов. Стало немного понятнее, хотя не все функции я так успела изучить. Такой подход помог понять работу некоторых функций. Но он сложен если нужно только основываясь на листингах понять что должна делать программа в целом для пользователя.

И последний способ изучения чужого кода я встретила в статье, посвященной тестированию. В ней автор предлагал писать тесты к неизвестной библиотеке, убивая при этом двух зайцев: в результате и код можно было изучить, и заодно проверить библиотеку на наличие всевозможных багов, дефектов и недокументированного поведения. Этот способ у меня провалился. Я несколько раз пыталась создать свой собственный класс на основе существующего, но компилятор почему-то упорно не хотел к этому классу создавать конструктор, говоря, что он является абстрактным (видимо, это был какой то глюк, т.к. все виртуальные функции я переопределила).

Итак, здесь есть несколько способов-отмычек, чтобы чужой код стал яснее. Я, как всегда, пишу статью  как будущего помощника себе самой. Может быть, и вам поможет применение данных методов. Может быть, что все эти методы не помогут. Видимо, в этом случае придется писать все с нуля. Кстати, это тоже метод изучения программ:). Желаю удачи!