evoasm 0.0.2.pre7 → 0.1.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gdbinit +41 -0
- data/.gitignore +1 -2
- data/.gitmodules +3 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.md +660 -0
- data/Makefile +1 -1
- data/README.md +17 -9
- data/Rakefile +39 -107
- data/bin/gdb +1 -1
- data/bin/gdb_loop +4 -0
- data/docs/FindingInstructions.md +17 -0
- data/docs/JIT.md +14 -0
- data/docs/SymbolicRegression.md +102 -0
- data/docs/Visualization.md +29 -0
- data/docs/examples/bit_insts.rb +44 -0
- data/docs/examples/jit.rb +26 -0
- data/docs/examples/loss.gif +0 -0
- data/docs/examples/program.png +0 -0
- data/docs/examples/sym_reg.rb +64 -0
- data/docs/examples/vis.rb +38 -0
- data/evoasm.gemspec +21 -15
- data/ext/evoasm_ext/Rakefile +3 -0
- data/ext/evoasm_ext/compile.rake +35 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
- data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
- data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
- data/lib/evoasm.rb +28 -11
- data/lib/evoasm/buffer.rb +105 -0
- data/lib/evoasm/capstone.rb +100 -0
- data/lib/evoasm/domain.rb +116 -0
- data/lib/evoasm/error.rb +37 -16
- data/lib/evoasm/exception_error.rb +19 -0
- data/lib/evoasm/ffi_ext.rb +53 -0
- data/lib/evoasm/libevoasm.rb +286 -0
- data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
- data/lib/evoasm/parameter.rb +20 -0
- data/lib/evoasm/population.rb +145 -0
- data/lib/evoasm/population/parameters.rb +227 -0
- data/lib/evoasm/population/plotter.rb +89 -0
- data/lib/evoasm/prng.rb +64 -0
- data/lib/evoasm/program.rb +195 -12
- data/lib/evoasm/program/io.rb +144 -0
- data/lib/evoasm/test.rb +8 -0
- data/lib/evoasm/version.rb +1 -1
- data/lib/evoasm/x64.rb +115 -0
- data/lib/evoasm/x64/cpu_state.rb +95 -0
- data/lib/evoasm/x64/instruction.rb +109 -0
- data/lib/evoasm/x64/operand.rb +156 -0
- data/lib/evoasm/x64/parameters.rb +211 -0
- data/test/helpers/population_helper.rb +128 -0
- data/test/helpers/test_helper.rb +1 -0
- data/test/helpers/x64_helper.rb +24 -0
- data/test/integration/bitwise_reverse_test.rb +41 -0
- data/test/integration/gcd_test.rb +52 -0
- data/test/integration/popcnt_test.rb +46 -0
- data/test/integration/sym_reg_test.rb +68 -0
- data/test/unit/evoasm/buffer_test.rb +48 -0
- data/test/unit/evoasm/capstone_test.rb +18 -0
- data/test/unit/evoasm/domain_test.rb +55 -0
- data/test/unit/evoasm/population/parameters_test.rb +106 -0
- data/test/unit/evoasm/population_test.rb +96 -0
- data/test/unit/evoasm/prng_test.rb +47 -0
- data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
- data/test/unit/evoasm/x64/encoding_test.rb +320 -0
- data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
- data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
- data/test/unit/evoasm/x64/instruction_test.rb +62 -0
- data/test/unit/evoasm/x64/parameters_test.rb +65 -0
- data/test/unit/evoasm/x64_test.rb +52 -0
- metadata +195 -89
- data/Gemfile.rake +0 -8
- data/Gemfile.rake.lock +0 -51
- data/LICENSE.txt +0 -373
- data/data/tables/README.md +0 -19
- data/data/tables/x64.csv +0 -1684
- data/data/templates/evoasm-x64.c.erb +0 -319
- data/data/templates/evoasm-x64.h.erb +0 -126
- data/examples/abs.yml +0 -20
- data/examples/popcnt.yml +0 -17
- data/examples/sym_reg.yml +0 -26
- data/exe/evoasm-search +0 -13
- data/ext/evoasm_ext/evoasm-alloc.c +0 -145
- data/ext/evoasm_ext/evoasm-alloc.h +0 -59
- data/ext/evoasm_ext/evoasm-arch.c +0 -44
- data/ext/evoasm_ext/evoasm-arch.h +0 -161
- data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
- data/ext/evoasm_ext/evoasm-buf.c +0 -130
- data/ext/evoasm_ext/evoasm-buf.h +0 -47
- data/ext/evoasm_ext/evoasm-error.c +0 -31
- data/ext/evoasm_ext/evoasm-error.h +0 -75
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
- data/ext/evoasm_ext/evoasm-log.h +0 -69
- data/ext/evoasm_ext/evoasm-misc.c +0 -23
- data/ext/evoasm_ext/evoasm-misc.h +0 -282
- data/ext/evoasm_ext/evoasm-param.h +0 -37
- data/ext/evoasm_ext/evoasm-search.c +0 -2145
- data/ext/evoasm_ext/evoasm-search.h +0 -214
- data/ext/evoasm_ext/evoasm-util.h +0 -40
- data/ext/evoasm_ext/evoasm-x64.c +0 -275624
- data/ext/evoasm_ext/evoasm-x64.h +0 -5436
- data/ext/evoasm_ext/evoasm.c +0 -7
- data/ext/evoasm_ext/evoasm.h +0 -23
- data/ext/evoasm_ext/evoasm_ext.c +0 -1757
- data/ext/evoasm_ext/extconf.rb +0 -31
- data/lib/evoasm/cli.rb +0 -6
- data/lib/evoasm/cli/search.rb +0 -127
- data/lib/evoasm/core_ext.rb +0 -1
- data/lib/evoasm/core_ext/array.rb +0 -9
- data/lib/evoasm/core_ext/integer.rb +0 -10
- data/lib/evoasm/core_ext/kwstruct.rb +0 -13
- data/lib/evoasm/core_ext/range.rb +0 -5
- data/lib/evoasm/examples.rb +0 -27
- data/lib/evoasm/gen.rb +0 -8
- data/lib/evoasm/gen/enum.rb +0 -169
- data/lib/evoasm/gen/name_util.rb +0 -80
- data/lib/evoasm/gen/state.rb +0 -176
- data/lib/evoasm/gen/state_dsl.rb +0 -152
- data/lib/evoasm/gen/strio.rb +0 -27
- data/lib/evoasm/gen/translator.rb +0 -1102
- data/lib/evoasm/gen/version.rb +0 -5
- data/lib/evoasm/gen/x64.rb +0 -237
- data/lib/evoasm/gen/x64/funcs.rb +0 -495
- data/lib/evoasm/gen/x64/inst.rb +0 -781
- data/lib/evoasm/search.rb +0 -40
- data/lib/evoasm/tasks/gen_task.rb +0 -86
- data/lib/evoasm/tasks/template_task.rb +0 -52
- data/test/test_helper.rb +0 -1
- data/test/x64/test_helper.rb +0 -19
- data/test/x64/x64_test.rb +0 -87
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require 'evoasm'
|
|
2
|
+
require 'evoasm/x64'
|
|
3
|
+
require 'tmpdir'
|
|
4
|
+
require 'pp'
|
|
5
|
+
require 'json'
|
|
6
|
+
|
|
7
|
+
module PopulationHelper
|
|
8
|
+
|
|
9
|
+
def set_default_parameters
|
|
10
|
+
@examples = {
|
|
11
|
+
1 => 2,
|
|
12
|
+
2 => 3,
|
|
13
|
+
3 => 4
|
|
14
|
+
}
|
|
15
|
+
@instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
|
|
16
|
+
@deme_size = 1200
|
|
17
|
+
@parameters = %i(reg0 reg1 reg2 reg3)
|
|
18
|
+
@recur_limit = 0
|
|
19
|
+
@deme_count = 1
|
|
20
|
+
@mutation_rate = 0.02
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def new_population(architecture = :x64)
|
|
24
|
+
parameters = Evoasm::Population::Parameters.new architecture do |p|
|
|
25
|
+
p.instructions = @instruction_names
|
|
26
|
+
p.kernel_size = @kernel_size
|
|
27
|
+
p.program_size = @program_size
|
|
28
|
+
p.deme_size = @deme_size
|
|
29
|
+
p.deme_count = @deme_count
|
|
30
|
+
p.examples = @examples
|
|
31
|
+
p.parameters = @parameters
|
|
32
|
+
p.domains = @domains if @domains
|
|
33
|
+
p.seed = @seed if @seed
|
|
34
|
+
p.recur_limit = @recur_limit
|
|
35
|
+
p.mutation_rate = @mutation_rate
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
Evoasm::Population.new parameters
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def start(loss = 0.0, min_generations: 0, max_generations: 1024, &block)
|
|
42
|
+
@population = new_population
|
|
43
|
+
@found_program = nil
|
|
44
|
+
|
|
45
|
+
@found_program, loss = @population.run(loss: loss, min_generations: min_generations, max_generations: max_generations) do
|
|
46
|
+
best_loss = @population.best_loss
|
|
47
|
+
if best_loss == Float::INFINITY
|
|
48
|
+
@population.seed
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
if block
|
|
52
|
+
block[@population.summary]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
@population.plot
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
module Tests
|
|
60
|
+
def found_program
|
|
61
|
+
@found_program
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def examples
|
|
65
|
+
@examples
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_program_found
|
|
69
|
+
refute_nil found_program, "no solution found"
|
|
70
|
+
assert_kind_of Evoasm::Program, found_program
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def assert_runs_examples(program)
|
|
74
|
+
assert_equal examples.values, program.run_all(*examples.keys)
|
|
75
|
+
p examples.keys
|
|
76
|
+
p program.run_all(*examples.keys)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_program_to_gv
|
|
80
|
+
filename = Dir::Tmpname.create(['evoasm_gv_test', '.png']) {}
|
|
81
|
+
found_program.to_gv.save(filename)
|
|
82
|
+
assert File.exist?(filename)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_program_run_all
|
|
86
|
+
assert_runs_examples found_program
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def random_code
|
|
90
|
+
# Fill registers with random values
|
|
91
|
+
|
|
92
|
+
ary = Array.new(10) { rand }
|
|
93
|
+
ary.sort! if rand < 0.5
|
|
94
|
+
ary.map! { |e| (e * rand(10_000)).to_i } if rand < 0.5
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_consistent_progress
|
|
98
|
+
|
|
99
|
+
5.times do
|
|
100
|
+
@seed = Array.new(Evoasm::PRNG::SEED_SIZE) { rand(10000) }
|
|
101
|
+
|
|
102
|
+
run_summaries = []
|
|
103
|
+
|
|
104
|
+
run_count = 3
|
|
105
|
+
run_count.times do
|
|
106
|
+
random_code
|
|
107
|
+
summaries = []
|
|
108
|
+
|
|
109
|
+
start(0.5, min_generations: 10, max_generations: 20) do |summary|
|
|
110
|
+
summaries << summary
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
run_summaries << summaries
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
assert_equal run_count, run_summaries.size
|
|
117
|
+
|
|
118
|
+
#run_summaries.each_with_index do |s, i|
|
|
119
|
+
# File.write("/tmp/t#{i}.txt", s.pretty_inspect)
|
|
120
|
+
#end
|
|
121
|
+
|
|
122
|
+
run_summaries.uniq.tap do |uniq|
|
|
123
|
+
assert_equal [run_summaries.first], uniq
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'evoasm'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'evoasm/x64'
|
|
3
|
+
|
|
4
|
+
module X64Helper
|
|
5
|
+
def assert_disassembles_to(exp_disasm, instruction_name, **parameters)
|
|
6
|
+
exp_disasm.force_encoding('ASCII-8BIT')
|
|
7
|
+
act_disasm = disassemble(Evoasm::X64.encode(instruction_name, parameters))
|
|
8
|
+
assert_equal exp_disasm, act_disasm
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def assert_assembles_to(exp_asm, inst_name, **params)
|
|
12
|
+
exp_asm.force_encoding('ASCII-8BIT')
|
|
13
|
+
act_asm = assemble(inst_name, **params)
|
|
14
|
+
assert_equal exp_asm, act_asm
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def disassemble(asm)
|
|
18
|
+
Evoasm::X64.disassemble(asm).first.join(' ')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def assemble(instruction_name, **parameters)
|
|
22
|
+
Evoasm::X64.encode(instruction_name, parameters)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/population'
|
|
3
|
+
require 'population_helper'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
module Evoasm
|
|
7
|
+
class BitwiseReverseTest < Minitest::Test
|
|
8
|
+
include PopulationHelper
|
|
9
|
+
include PopulationHelper::Tests
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
set_default_parameters
|
|
13
|
+
|
|
14
|
+
@instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
|
|
15
|
+
@examples = {
|
|
16
|
+
0b00000000 => 0b00000000,
|
|
17
|
+
0b10000000 => 0b00000001,
|
|
18
|
+
0b01000000 => 0b00000010,
|
|
19
|
+
0b01100000 => 0b00000110,
|
|
20
|
+
0b00010000 => 0b00001000,
|
|
21
|
+
0b00001000 => 0b00010000,
|
|
22
|
+
0b00000110 => 0b01100000,
|
|
23
|
+
}
|
|
24
|
+
@kernel_size = 30
|
|
25
|
+
@program_size = 2
|
|
26
|
+
@deme_count = 2
|
|
27
|
+
@parameters = %i(reg0 reg1 reg2 reg3)
|
|
28
|
+
@mutation_rate = 0.5
|
|
29
|
+
|
|
30
|
+
start
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_program_size
|
|
35
|
+
assert_equal 1, found_program.size
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_program_run
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/population'
|
|
3
|
+
require 'evoasm/prng'
|
|
4
|
+
require 'population_helper'
|
|
5
|
+
|
|
6
|
+
Evoasm.log_level = :warn
|
|
7
|
+
require 'pp'
|
|
8
|
+
module Search
|
|
9
|
+
class GCDTest < Minitest::Test
|
|
10
|
+
include PopulationHelper
|
|
11
|
+
include PopulationHelper::Tests
|
|
12
|
+
|
|
13
|
+
SEED = Array.new(Evoasm::PRNG::SEED_SIZE) { rand(10000) }
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
set_default_parameters
|
|
17
|
+
|
|
18
|
+
@instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
|
|
19
|
+
|
|
20
|
+
@examples = {
|
|
21
|
+
[5, 1] => 1,
|
|
22
|
+
[15, 5] => 5,
|
|
23
|
+
[8, 2] => 2,
|
|
24
|
+
[8, 4] => 4,
|
|
25
|
+
[8, 6] => 2,
|
|
26
|
+
[16, 8] => 8
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@seed = SEED
|
|
30
|
+
@kernel_size = 20
|
|
31
|
+
@program_size = 5
|
|
32
|
+
@mutation_rate = 0.0
|
|
33
|
+
@deme_count = 5
|
|
34
|
+
@recur_limit = 100
|
|
35
|
+
#@deme_size = 5000
|
|
36
|
+
#@mutation_rate = 0.2
|
|
37
|
+
@parameters = %i(reg0 reg1 reg2 reg3)
|
|
38
|
+
|
|
39
|
+
unless self.name == 'test_consistent_progress'
|
|
40
|
+
start
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
make_my_diffs_pretty!
|
|
45
|
+
|
|
46
|
+
def test_program_run
|
|
47
|
+
# should generalize (i.e. give correct answer for non-training data)
|
|
48
|
+
#assert_equal 2, found_program.run(16, 6)
|
|
49
|
+
#assert_equal 1, found_program.run(15, 2)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/population'
|
|
3
|
+
require 'population_helper'
|
|
4
|
+
|
|
5
|
+
module Evoasm
|
|
6
|
+
class PopcntTest < Minitest::Test
|
|
7
|
+
include PopulationHelper
|
|
8
|
+
include PopulationHelper::Tests
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
set_default_parameters
|
|
12
|
+
|
|
13
|
+
@instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
|
|
14
|
+
@examples = {
|
|
15
|
+
0b0 => 0,
|
|
16
|
+
0b1 => 1,
|
|
17
|
+
0b110 => 2,
|
|
18
|
+
0b101 => 2,
|
|
19
|
+
0b111 => 3,
|
|
20
|
+
0b100 => 1,
|
|
21
|
+
0b101010 => 3,
|
|
22
|
+
0b1010 => 2,
|
|
23
|
+
0b10000 => 1,
|
|
24
|
+
0b100001 => 2,
|
|
25
|
+
0b101011 => 4
|
|
26
|
+
}
|
|
27
|
+
@kernel_size = 1
|
|
28
|
+
@program_size = 1
|
|
29
|
+
@parameters = %i(reg0 reg1 reg2 reg3)
|
|
30
|
+
|
|
31
|
+
start
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_program_size
|
|
36
|
+
assert_equal 1, found_program.size
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_program_run
|
|
40
|
+
# should generalize (i.e. give correct answer for non-training data)
|
|
41
|
+
assert_equal 2, found_program.run(0b1001)
|
|
42
|
+
assert_equal 1, found_program.run(0b1000)
|
|
43
|
+
assert_equal 3, found_program.run(0b1101)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/population'
|
|
3
|
+
require 'population_helper'
|
|
4
|
+
|
|
5
|
+
#Evoasm.min_log_level = :info
|
|
6
|
+
|
|
7
|
+
module Evoasm
|
|
8
|
+
class SymRegTest < Minitest::Test
|
|
9
|
+
include PopulationHelper
|
|
10
|
+
include PopulationHelper::Tests
|
|
11
|
+
|
|
12
|
+
def setup
|
|
13
|
+
set_default_parameters
|
|
14
|
+
|
|
15
|
+
@instruction_names = Evoasm::X64.instruction_names(:xmm).grep /(add|mul|sqrt).*?sd/
|
|
16
|
+
@examples = {
|
|
17
|
+
0.0 => 0.0,
|
|
18
|
+
0.5 => 1.0606601717798212,
|
|
19
|
+
1.0 => 1.7320508075688772,
|
|
20
|
+
1.5 => 2.5248762345905194,
|
|
21
|
+
2.0 => 3.4641016151377544,
|
|
22
|
+
2.5 => 4.541475531146237,
|
|
23
|
+
3.0 => 5.744562646538029,
|
|
24
|
+
3.5 => 7.0622234459127675,
|
|
25
|
+
4.0 => 8.48528137423857,
|
|
26
|
+
4.5 => 10.00624804809475,
|
|
27
|
+
5.0 => 11.61895003862225
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@kernel_size = 10
|
|
31
|
+
@program_size = 1
|
|
32
|
+
@parameters = %i(reg0 reg1 reg2 reg3)
|
|
33
|
+
regs = %i(xmm0 xmm1 xmm2 xmm3)
|
|
34
|
+
@domains = {
|
|
35
|
+
reg0: regs,
|
|
36
|
+
reg1: regs,
|
|
37
|
+
reg2: regs,
|
|
38
|
+
reg3: regs
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
start
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_program_size
|
|
45
|
+
assert_equal 1, found_program.size
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_intron_elimination
|
|
49
|
+
disasms = found_program.disassemble
|
|
50
|
+
|
|
51
|
+
program = found_program.eliminate_introns
|
|
52
|
+
assert_runs_examples program
|
|
53
|
+
refute_equal program, found_program
|
|
54
|
+
|
|
55
|
+
program.disassemble.each_with_index do |disasm, index|
|
|
56
|
+
assert_operator disasm.size, :<=, disasms[index].size
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_program_run
|
|
61
|
+
# should generalize (i.e. give correct answer for non-training data)
|
|
62
|
+
p found_program.run_all(*@examples.keys)
|
|
63
|
+
assert_equal 31.937438845342623, found_program.run(10.0)
|
|
64
|
+
assert_equal 36.78314831549904, found_program.run(11.0)
|
|
65
|
+
assert_equal 41.8568990729127, found_program.run(12.0)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/x64'
|
|
3
|
+
require 'evoasm/buffer'
|
|
4
|
+
|
|
5
|
+
module Evoasm
|
|
6
|
+
class BufferTest < Minitest::Test
|
|
7
|
+
def setup
|
|
8
|
+
@mmap_buffer = Buffer.new(1024, :mmap)
|
|
9
|
+
@malloc_buffer = Buffer.new(1024, :malloc)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_type
|
|
13
|
+
assert_equal :mmap, @mmap_buffer.type
|
|
14
|
+
assert_equal :malloc, @malloc_buffer.type
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_capacity
|
|
18
|
+
assert_equal 1024, @mmap_buffer.capacity
|
|
19
|
+
assert_equal 1024, @malloc_buffer.capacity
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_position
|
|
23
|
+
assert_equal 0, @mmap_buffer.position
|
|
24
|
+
assert_equal 0, @malloc_buffer.position
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_to_s
|
|
28
|
+
assert_equal "\0" * @mmap_buffer.capacity, @mmap_buffer.to_s
|
|
29
|
+
assert_equal @malloc_buffer.capacity, @malloc_buffer.to_s.size
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_write
|
|
33
|
+
data = "\xA\xB\xC"
|
|
34
|
+
@mmap_buffer.write data
|
|
35
|
+
assert_equal data, @mmap_buffer.to_s[0...data.size]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_execute
|
|
39
|
+
Evoasm::X64.encode(:mov_rm32_imm32, {reg0: :a, imm0: 7}, @mmap_buffer)
|
|
40
|
+
Evoasm::X64.encode(:ret, {}, @mmap_buffer)
|
|
41
|
+
|
|
42
|
+
#@mmap_buffer.__log__ :warn
|
|
43
|
+
|
|
44
|
+
assert_equal 7, @mmap_buffer.execute!
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/capstone'
|
|
3
|
+
|
|
4
|
+
class CapstoneTest < Minitest::Test
|
|
5
|
+
def test_disassemble_x64
|
|
6
|
+
|
|
7
|
+
asm = "\x55\x48\x8b\x05\xb8\x13\x00\x00"
|
|
8
|
+
inst1 = ['push', 'rbp']
|
|
9
|
+
inst2 = ['mov', 'rax, qword ptr [rip + 0x13b8]']
|
|
10
|
+
|
|
11
|
+
assert_equal [inst1, inst2],
|
|
12
|
+
Evoasm::Capstone.disassemble_x64(asm)
|
|
13
|
+
|
|
14
|
+
assert_equal [[0x80, *inst1], [0x81, *inst2]],
|
|
15
|
+
Evoasm::Capstone.disassemble_x64(asm, 0x80)
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'evoasm/test'
|
|
2
|
+
require 'evoasm/domain'
|
|
3
|
+
require 'evoasm/prng'
|
|
4
|
+
|
|
5
|
+
module Evoasm
|
|
6
|
+
class DomainTest < Minitest::Test
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
@prng = PRNG.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_enumeration_domain
|
|
13
|
+
enumeration_domain = Evoasm::EnumerationDomain.new 1, 2, 3, 4
|
|
14
|
+
assert_equal [1, 2, 3, 4], enumeration_domain.values
|
|
15
|
+
assert_equal 4, enumeration_domain.length
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_range_domain
|
|
19
|
+
range_domain = Evoasm::RangeDomain.new -10, 100
|
|
20
|
+
assert_equal -10, range_domain.min
|
|
21
|
+
assert_equal 100, range_domain.max
|
|
22
|
+
|
|
23
|
+
100.times do
|
|
24
|
+
assert_operator range_domain.rand(@prng), :>=, -10
|
|
25
|
+
assert_operator range_domain.rand(@prng), :<=, 100
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
range_domain = Evoasm::RangeDomain.new 10, 100_000
|
|
29
|
+
assert_equal 10, range_domain.min
|
|
30
|
+
assert_equal 100_000, range_domain.max
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_type_domain
|
|
34
|
+
type_domain = Evoasm::TypeDomain.new :int8
|
|
35
|
+
assert_equal :int8, type_domain.type
|
|
36
|
+
assert_equal -2**7, type_domain.min
|
|
37
|
+
assert_equal 2**7 - 1, type_domain.max
|
|
38
|
+
|
|
39
|
+
type_domain = Evoasm::TypeDomain.new :int16
|
|
40
|
+
assert_equal :int16, type_domain.type
|
|
41
|
+
assert_equal -2**15, type_domain.min
|
|
42
|
+
assert_equal 2**15 - 1, type_domain.max
|
|
43
|
+
|
|
44
|
+
type_domain = Evoasm::TypeDomain.new :int32
|
|
45
|
+
assert_equal :int32, type_domain.type
|
|
46
|
+
assert_equal -2**31, type_domain.min
|
|
47
|
+
assert_equal 2**31 - 1, type_domain.max
|
|
48
|
+
|
|
49
|
+
type_domain = Evoasm::TypeDomain.new :int64
|
|
50
|
+
assert_equal :int64, type_domain.type
|
|
51
|
+
assert_equal -2**63, type_domain.min
|
|
52
|
+
assert_equal 2**63 - 1, type_domain.max
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|