“…Reverse engineering goals are multiple, e.g., coping with complexity, generating alternate views, recovering lost information, detecting side effects, synthesizing higher abstractions, and facilitating reuse. Examples of problem areas where reverse engineering has been successfully applied include redocumenting programs [11] and relational databases [94], identifying reusable assets [23], recovering architectures [67], recovering design patterns [2,53,68,108], building traceability between code and documentation [1,76], identifying clones [7,10,62,81], code smells [111] and aspects [79,106], computing change impacts [6], reverse engineering binary code [29], renewing user interfaces [84,89], translating a program from one language to another [19], migrating [22] or wrapping legacy code [99]. Although software reverse engineering originated in software maintenance, its definition is sufficiently broad so as to be applicable to many problem areas, for example to create representations necessary for testing purposes [82], or to audit security and vulnerability [34].…”