NAME=zs unset
FILE=-
CMDS=<<EOF
zs test1
za foo1 b aabbccdd
za bar1 b aabbccdd
zs test2
za foo2 b aabbccdd
za bar2 b aabbccdd
zs test3
za foo3 b aabbccdd
za bar3 b aabbccdd
zs *
zs-test2
z~foo1
z~bar1
z~foo2
z~bar2
z~foo3
z~bar3
EOF
EXPECT=<<EOF
(test1) foo1:
(test1) bar1:
foo2:
bar2:
(test3) foo3:
(test3) bar3:
EOF
RUN

NAME=zsr newname
FILE=-
CMDS=<<EOF
zs test1
za foo1 b aabbccdd
za bar1 b aabbccdd
zs test2
za foo2 b aabbccdd
za bar2 b aabbccdd
zs test3
za foo3 b aabbccdd
za bar3 b aabbccdd
zs test2
zsr newtest2
zs *
z~foo1
z~bar1
z~foo2
z~bar2
z~foo3
z~bar3
EOF
EXPECT=<<EOF
(test1) foo1:
(test1) bar1:
(newtest2) foo2:
(newtest2) bar2:
(test3) foo3:
(test3) bar3:
EOF
RUN

NAME=zsr newname (duplicated name)
FILE=-
CMDS=<<EOF
zs test1
za foo1 b aabbccdd
za bar1 b aabbccdd
zs test2
za foo2 b aabbccdd
za bar2 b aabbccdd
zs test3
za foo3 b aabbccdd
za bar3 b aabbccdd
zs test2
zsr test1
zs *
z~foo1
z~bar1
z~foo2
z~bar2
z~foo3
z~bar3
EOF
EXPECT=<<EOF
(test1) foo1:
(test1) bar1:
(test2) foo2:
(test2) bar2:
(test3) foo3:
(test3) bar3:
EOF
RUN

NAME=zsr newname (root zs)
FILE=-
CMDS=<<EOF
zs test1
za foo1 b aabbccdd
za bar1 b aabbccdd
zs test2
za foo2 b aabbccdd
za bar2 b aabbccdd
zs test3
za foo3 b aabbccdd
za bar3 b aabbccdd
zs *
zsr newtest
z~foo1
z~bar1
z~foo2
z~bar2
z~foo3
z~bar3
EOF
EXPECT=<<EOF
(test1) foo1:
(test1) bar1:
(test2) foo2:
(test2) bar2:
(test3) foo3:
(test3) bar3:
EOF
RUN

NAME=z-
FILE=-
CMDS=<<EOF
zs test
za foo b aa
zs test2
za foo b aa
za bar b bb
zs *
z-foo
z
zs test2
z-foo
z
zs *
z
zs-test
z
z-foo
z
EOF
EXPECT=<<EOF
(test2) bar:
  bytes: bb
  mask: ff
(test) foo:
  bytes: aa
  mask: ff
(test2) foo:
  bytes: aa
  mask: ff
bar:
  bytes: bb
  mask: ff
(test2) bar:
  bytes: bb
  mask: ff
(test) foo:
  bytes: aa
  mask: ff
(test2) bar:
  bytes: bb
  mask: ff
foo:
  bytes: aa
  mask: ff
(test2) bar:
  bytes: bb
  mask: ff
EOF
RUN

NAME=z-*
FILE=-
CMDS=<<EOF
zs test1
za foo1 b aabbccdd
za bar1 b aabbccdd
zs test2
za foo2 b aabbccdd
za bar2 b aabbccdd
zs test3
za foo3 b aabbccdd
za bar3 b aabbccdd
zs test2
z-*
zs *
z~foo2
z~bar2
EOF
EXPECT=<<EOF
EOF
RUN

NAME=za b and binmasks
FILE=-
CMDS=<<EOF
za test b .abbc.dd..
z
EOF
EXPECT=<<EOF
test:
  bytes: 0abbc0dd00
  mask: 0ffff0ff00
EOF
RUN

NAME=za b zero mask
FILE=-
CMDS=<<EOF
za test b ....
z
EOF
EXPECT=<<EOF
EOF
RUN

NAME=za g
FILE=-
CMDS=<<EOF
za test g cc=1 nbbs=2 edges=3 ebbs=4
z
EOF
EXPECT=<<EOF
test:
  graph: cc=1 nbbs=2 edges=3 ebbs=4 bbsum=0
EOF
RUN

NAME=za o
FILE=-
CMDS=<<EOF
za test o 0x8048123
z
EOF
EXPECT=<<EOF
test:
  addr: 0x08048123
EOF
RUN

NAME=za r
FILE=-
CMDS=<<EOF
za test r sym1 sym3 sym2
z
EOF
EXPECT=<<EOF
test:
  refs: sym1, sym3, sym2
EOF
RUN

NAME=za b + z/
FILE=bins/elf/analysis/go_stripped
CMDS=<<EOF
za sym.fmt.Println b 653b2530000000724b53b834e7150883ec188b15401c22088d4c24048b5c242083ec08ff742434ff742434ff742434525051e829ffffff8b44242089038b4424248943048b44242889430889d883c4345bc204006a106a1ce85e350700c20400
z/
?v sign.bytes.sym.fmt.Println_0
EOF
EXPECT=<<EOF
0x805b030
EOF
RUN

NAME=za a + z/
FILE=bins/elf/analysis/go_stripped
CMDS=<<EOF
za sym.fmt.Println a 653b2530000000724b53b834e7150883ec188b15401c22088d4c24048b5c242083ec08ff742434ff742434ff742434525051e829ffffff8b44242089038b4424248943048b44242889430889d883c4345bc204006a106a1ce85e350700c20400
z/
?v sign.bytes.sym.fmt.Println_1
EOF
EXPECT=<<EOF
0x805b030
EOF
RUN

NAME=za r + z/
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
za main r sym.print
z/
?v sign.refs.main_0
EOF
EXPECT=<<EOF
0x40055b
EOF
RUN

NAME=z/ with search.in
FILE=bins/elf/analysis/go_stripped
CMDS=<<EOF
za date_string b 323030362d30312d30322031353a30343a30352e393939393939393939202d30373030204d535400
za sym.fmt.Println b 653b2530000000724b53b834e7150883ec188b15401c22088d4c24048b5c242083ec08ff742434ff742434ff742434525051e829ffffff8b44242089038b4424248943048b44242889430889d883c4345bc204006a106a1ce85e350700c20400
fs sign
f~?
e io.va=0
e search.in=file
z/
e io.va=1
?v sign.bytes.date_string_0
?v sign.bytes.sym.fmt.Println_0
f-*
f~?
e search.in=bin.sections.x
z/
?v sign.bytes.elf_header_0
?v sign.bytes.sym.fmt.Println_0
EOF
EXPECT=<<EOF
0
0x15d898
0x13030
0
0x0
0x805b030
EOF
RUN

NAME=z/ with search.align
FILE=malloc://1024
CMDS=<<EOF
wx 00112233445566778899aabbccddeeff
za foo b 1122
e zign.minsz = 0
e zign.mincc = 0
fs *
e search.align=2
z/
f~?
e search.align=1
z/
f~sign?
EOF
EXPECT=<<EOF
0
1
EOF
RUN

NAME=z/ with search.{from,to}
FILE=malloc://1024
CMDS=<<EOF
wx 00112233445566778899aabbccddeeff
za a b 11223344
za b b bbccddee
e zign.minsz = 0
e zign.mincc = 0
fs *
f~?
e search.in=range
e search.from=0x0
e search.to=0x8
z/
?v sign.bytes.a_0
?v sign.bytes.b_0
f-*
f~?
e search.from=0x8
e search.to=0xf
z/
?v sign.bytes.a_0
?v sign.bytes.b_0
EOF
EXPECT=<<EOF
0
0x1
0x0
0
0x0
0xb
EOF
RUN

NAME=z/ with zign.minsz
FILE=malloc://1024
CMDS=<<EOF
wx 00112233445566778899aabbccddeeff
za foo b 11223344
e zign.minsz = 0
fs *
z/
f~sign?
f-*
e zign.minsz = 5
z/
f~?
EOF
EXPECT=<<EOF
1
0
EOF
RUN

NAME=za b ; z/ ; aa ; axt
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
za sym.print b 5548....48......48......48......48....bf........b8........e8........90c9c3
z/
e anal.hasnext=0
aa
axt 0x400536
EOF
EXPECT=<<EOF
main 0x40056f [CALL:--x] call sym.print
EOF
RUN

NAME=zaf
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
e zign.mincc = 0
zs zigs
zaf main
z
zs *
z
EOF
EXPECT=<<EOF
main:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
(zigs) main:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
EOF
RUN

NAME=zaf at offset
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
e zign.mincc = 0
zs zigs
zaf @ main
z
zs *
z
EOF
EXPECT=<<EOF
main:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
(zigs) main:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
EOF
RUN

NAME=zaf (root zignspace)
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
e zign.mincc = 0
zaf main
z
EOF
EXPECT=<<EOF
main:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
EOF
RUN

NAME=zaf zigname
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
e zign.mincc = 0
zs zigs
zaf main foobar
z
EOF
EXPECT=<<EOF
foobar:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  realname: foobar
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
EOF
RUN

NAME=zaf zigname (root zignspace)
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
e zign.mincc = 0
zaf main foobar
z
EOF
EXPECT=<<EOF
foobar:
  bytes: 554889e54883ec10897dfc488975f0bf13064000e8c2ffffffb800000000c9c3
  mask: ffffffffffffffffffffffffffffffff00000000ff00000000ffffffffffffff
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=32
  addr: 0x0040055b
  realname: foobar
  rawname: main
  types: int main (int argc, char **argv)
  refs: sym.print
  xrefs: entry0
  vars: fb-12:var_4h:int64_t, fb-24:var_10h:int64_t, tr83:argc:int, tr79:argv:char **
  bbhash: 9890426532f35eb3a80fe773d887714fe27d13ea125ad7e90beab16a51b74496
EOF
RUN

NAME=zs + zaf + z/
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
zs zigs
zaf main
z/
?v sign.bytes.main_0
EOF
EXPECT=<<EOF
0x40055b
EOF
RUN

NAME=zs + zaf zigname + z/
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
zaf main foobar
z/
?v sign.bytes.foobar_0
EOF
EXPECT=<<EOF
0x40055b
EOF
RUN

NAME=zs * searches all zignspaces
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
zs test
zaf main foobar
zs *
z/
?v sign.bytes.foobar_0
EOF
EXPECT=<<EOF
0x40055b
EOF
RUN

NAME=zc
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print b 5548....48......48......48......48....bf........b8........e8........90c9c3
z. @@ fcn*
?v sign.bytes_func.sym.print_0
EOF
EXPECT=<<EOF
0x400536
EOF
RUN

NAME=zc graph zign
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print g cc=1 nbbs=1 edges=0 ebbs=1
e zign.mincc = 0
z. @@ fcn*
?v sign.graph.sym.print_0
EOF
EXPECT=<<EOF
0x400536
EOF
RUN

NAME=zc graph zign with zign.mincc
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print g cc=1 nbbs=1 edges=0 ebbs=1
e zign.mincc = 0
z. @@ fcn*
?v sign.graph.sym.print_0
f-*
e zign.mincc = 10
z. @@ fcn*
?v sign.graph.sym.print_0
EOF
EXPECT=<<EOF
0x400536
0x0
EOF
RUN

NAME=z/ graph zign
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print_metric g cc=1 nbbs=1 edges=0 ebbs=1
e zign.mincc = 0
z/
?v sign.graph.sym.print_metric_3
EOF
EXPECT=<<EOF
0x400536
EOF
RUN

NAME=z/ bytes + graph zign
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print b 5548....48......48......48......48....bf........b8........e8........90c9c3
za sym.print g cc=1 nbbs=1 edges=0 ebbs=1
e zign.minsz = 0
e zign.mincc = 0
z/
?v sign.bytes.sym.print_0
?v sign.graph.sym.print_4
EOF
EXPECT=<<EOF
0x400536
0x400536
EOF
RUN

NAME=z/ + zign.{bytes,graph}
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print b 5548....48......48......48......48....bf........b8........e8........90c9c3
za sym.print g cc=1 nbbs=1 edges=0 ebbs=1
e zign.minsz = 0
e zign.mincc = 0
fs sign
e zign.bytes = true
e zign.graph = false
z/
f~sign.bytes.sym.print?
f~sign.graph.sym.print?
f-*
e zign.bytes = false
e zign.graph = true
z/
f~sign.bytes.sym.print?
f~sign.graph.sym.print?
EOF
EXPECT=<<EOF
1
0
0
5
EOF
RUN

NAME=zc + zign.{bytes,graph}
FILE=bins/elf/analysis/zigs_stripped
CMDS=<<EOF
aa
za sym.print b 5548....48......48......48......48....bf........b8........e8........90c9c3
za sym.print g cc=1 nbbs=1 edges=0 ebbs=1
e zign.minsz = 0
e zign.mincc = 0
fs sign
e zign.bytes = true
e zign.graph = false
z. @ 0x400536
f~sign.bytes_func.sym.print?
f~sign.graph.sym.print?
f-*
e zign.bytes = false
e zign.graph = true
z. @ 0x400536
f~sign.bytes.sym.print?
f~sign.graph.sym.print?
EOF
EXPECT=<<EOF
1
0
0
1
EOF
RUN

NAME=zb negative count
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb -1
EOF
EXPECT=<<EOF
EOF
RUN

NAME=zb single exact match
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb
EOF
EXPECT=<<EOF
1.00000  1.00000 B  1.00000 G   sym.exact
EOF
RUN

NAME=zb match 5 by default
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.second g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.second b ff5541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.third g cc=16 nbbs=28 edges=44 ebbs=1 bbsum=407
za sym.third b ffff41544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fourth g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=407
za sym.fourth b ffffff544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fith g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=401
za sym.fith b ffffffff4989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.not_shown g cc=15 nbbs=28 edges=43 ebbs=1 bbsum=395
za sym.not_shown b ffffffffff89fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb ~[5]
EOF
EXPECT=<<EOF
sym.exact
sym.second
sym.third
sym.fourth
sym.fith
EOF
RUN

NAME=zbj
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.second g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.second b ff5541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.third g cc=16 nbbs=28 edges=44 ebbs=1 bbsum=407
za sym.third b ffff41544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fourth g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=407
za sym.fourth b ffffff544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fith g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=401
za sym.fith b ffffffff4989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.not_shown g cc=15 nbbs=28 edges=43 ebbs=1 bbsum=395
za sym.not_shown b ffffffffff89fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbj~{[0][name]}
EOF
EXPECT=<<EOF
sym.exact
EOF
RUN

NAME=zb match 6 of 6 with 100 count
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.second g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.second b ff5541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.third g cc=16 nbbs=28 edges=44 ebbs=1 bbsum=407
za sym.third b ffff41544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fourth g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=407
za sym.fourth b ffffff544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fith g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=401
za sym.fith b ffffffff4989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.sixth g cc=15 nbbs=28 edges=43 ebbs=1 bbsum=395
za sym.sixth b ffffffffff89fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb 100~[5]
EOF
EXPECT=<<EOF
sym.exact
sym.second
sym.third
sym.fourth
sym.fith
sym.sixth
EOF
RUN

NAME=zb ignore masked bytes
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.perf1 b 415541544989fc55534883ec08e800000000488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.perf2 b 415541544989fc55534883ec08e8ffffffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb ~[0]
EOF
EXPECT=<<EOF
1.00000
1.00000
EOF
RUN

NAME=zb count 1
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.right g cc=16 nbbs=28 edges=44 ebbs=1 bbsum=407
za sym.right b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.wrong g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=407
za sym.wrong b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.nope g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=401
za sym.nope b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.bad g cc=15 nbbs=28 edges=43 ebbs=1 bbsum=395
za sym.bad b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb 1 ~?
EOF
EXPECT=<<EOF
1
EOF
RUN

NAME=zb duplicate zigs match
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.duplicate1 g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.duplicate1 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.duplicate2 g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.duplicate2 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.duplicate3 g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.duplicate3 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.duplicate4 g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.duplicate4 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.duplicate5 g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.duplicate5 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.duplicate6 g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.duplicate6 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb ~sym.duplicate?
EOF
EXPECT=<<EOF
4
EOF
RUN

NAME=zj producing valid types
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
af @0x00484d40
zaf fcn.00484d40 fcn.00484d40
zj~{[0][types]}
EOF
EXPECT=<<EOF
void fcn.00484d40 (int64_t arg1)
EOF
RUN

NAME=x86-64 function with hole
FILE=bins/elf/libc.so.6
CMDS=<<EOF
s 0xec800
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym.__write b f30f1efa488d05256d0d008b0085c07517b8010000000f05483d00f0ffff7758c30f1f800000000041544989d4554889f55389fb4883ec10e823c901004c89e24889ee89df4189c0b8010000000f05483d00f0ffff77354489c74889442408e85cc90100488b4424084883c4105b5d415cc3660f1f440000488b15c1150d00f7d864890248c7c0ffffffffc3488b15ad150d00f7d864890248c7c0ffffffffebb6:ffffffffff000000000000ffffffffff00ffffffffffffffff0000000000ff00ff00000000000000ffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff0000000000ff00ffffffffffffffffff00000000ffffffffffffffffffffffffffff000000000000ff000000000000ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff00
za sym.__write g cc=6 nbbs=7 edges=7 ebbs=3 bbsum=148
za sym.__write o 0x000ec800
za sym.__write R X193cml0ZQ==
za sym.__write t void sym.__write (int64_t arg1, int64_t arg2, int64_t arg3)
za sym.__write r sym.__libc_enable_asynccancel sym.__libc_disable_asynccancel
za sym.__write v fs-32:var_8h:int64_t, tr73:arg3:int64_t, tr79:arg2:int64_t, tr83:arg1:int64_t
za sym.__write h 4f2d194bae72345352b26e0a36531e7d6ff6cb5d6b50b92487246507b8dafdc5
EOF
RUN

NAME=x86-64 function with jumpback
FILE=bins/elf/libc.so.6
CMDS=<<EOF
s 0x8a900
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym.bcopy b f30f1efa4887fee92479f9ff:ffffffffffffffff00000000
za sym.bcopy g cc=0 nbbs=1 edges=1 ebbs=0 bbsum=12
za sym.bcopy o 0x0008a900
za sym.bcopy R YmNvcHk=
za sym.bcopy t void sym.bcopy (int64_t arg1)
za sym.bcopy v tr83:arg1:int64_t
za sym.bcopy h 6f9938a0cb75b842a94a45bfe2f8c83832359627e228926dc396950b678fb5df
EOF
RUN

NAME=x86-64 r_sign_fcn_bytes bounds check
FILE=bins/elf/libc.so.6
CMDS=<<EOF
s 0x0593a0
e zign.maxsz = 41
af
zaf
z* ~za sym._IO_printf b
EOF
EXPECT=<<EOF
za sym._IO_printf b f30f1efa4881ecd80000004889742428488954243048894c24384c894424404c894c244884c074370f:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff
EOF
RUN

NAME=80386 function with hole
FILE=bins/elf/fcn_in_test.elf
CMDS=<<EOF
s 0x1090
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym.deregister_tm_clones b e8e400000081c26b2f00008d8a180000008d821800000039c8741d8b82ecffffff85c074135589e583ec1451ffd083c410c9c38d74260090c3:ff00000000ff0000000000ffffffffffffffffffffffffffffff00ffffffffffffffffff00ffffffffffffffffffffffffffff0000000000ff
za sym.deregister_tm_clones g cc=4 nbbs=4 edges=4 ebbs=2 bbsum=52
za sym.deregister_tm_clones o 0x00001090
za sym.deregister_tm_clones R ZGVyZWdpc3Rlcl90bV9jbG9uZXM=
za sym.deregister_tm_clones t void sym.deregister_tm_clones ()
za sym.deregister_tm_clones r sym.__x86.get_pc_thunk.dx
za sym.deregister_tm_clones h 903d0936e77ecc1f2e91f7b2eb2476fdc06d7f2ba9501b1436468dbda5d7caaa
EOF
RUN

NAME=80386 function with jumpback
FILE=bins/elf/fcn_in_test.elf
CMDS=<<EOF
s 0x1184
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za main b 31c075f8ebf689c05090909090c3:ffffff00ff00ffffffffffffffff
za main g cc=2 nbbs=4 edges=4 ebbs=1 bbsum=18
za main o 0x00001184
za main R bWFpbg==
za main t int main (int argc, char **argv, char **envp)
za main h a9f218a725149b64061b9064406b46abe5653b97eb0f88a3e3e0086d1532c898
EOF
RUN

NAME=80386 r_sign_fcn_bytes bounds check
FILE=bins/elf/fcn_in_test.elf
CMDS=<<EOF
s 0x00001120
e zign.maxsz = 32
af
zaf
z* ~za entry.fini0 b
EOF
EXPECT=<<EOF
za entry.fini0 b f30f1efb5589e553e853ffffff81c3d32e000083ec0480bb180000000075288b:ffffffffffffffffff00000000ff0000000000ffffffffffffffffffffff00ff
EOF
RUN

NAME=MIPS R3000 function with hole
FILE=bins/elf/libc.so.0
CMDS=<<EOF
s 0x00051490
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym.fpathconf b 3c1c0005279c11200399e02127bdfef8afbf0100afb100fcafb000f8afbc001004810008008088218f9980180320f809000000008fbc00102404ffff100000142403000910a000412404007f24a5ffff2ca20013104000088f83805c0005108024638d00004310218c420000005c102100400008000000008f9980180320f809000000008fbc00102404ffff240300161000002eac4300001000002c240400ff8f9980180320f809000000008fbc00100220202127a500188f998224004080210320f8098c510000044100088fbc00108e030000240200591462001c2404ffff240400ff10000019ae110000100000178fa40040100000152404100010000013000020218f9980f0022020210320f80927a500600440000c8fbc00108fa200743043f0003402800010620003240260001462000500000000100000042404000110000002240400202404ffff8fbf01008fb100fc8fb000f80080102103e0000827bd0108:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff
za sym.fpathconf g cc=5 nbbs=8 edges=9 ebbs=2 bbsum=176
za sym.fpathconf o 0x00051490
za sym.fpathconf R ZnBhdGhjb25m
za sym.fpathconf t void sym.fpathconf (int32_t arg1, int32_t arg2)
za sym.fpathconf r sym.__errno_location sym.__errno_location
za sym.fpathconf v fs-8:var_100h:int32_t, fs-12:var_fch:int32_t, fs-16:var_f8h:int32_t, fs-248:var_10h:int32_t, tr4:arg1:int32_t, tr5:arg2:int32_t
za sym.fpathconf h 52f232c2d8158ce806cadf84ed77273fb11711dfa6cb5feb997ce03c1459be43
EOF
RUN

NAME=MIPS R3000 function with jumpback
FILE=bins/elf/ld-uClibc-0.9.33.2.so
CMDS=<<EOF
s 0x2a1c
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym._dl_malloc b 3c1c0002279cc5e40399e0218f82807427bdfff88c590000afbe00041320000503a0f02103c0e8218fbe00040320000827bd000803c0e8218f99801c8fbe0004273928dc1000ff9e27bd0008:ffffffffffffffffffffffffff000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff
za sym._dl_malloc g cc=8 nbbs=12 edges=16 ebbs=2 bbsum=396
za sym._dl_malloc o 0x00002a1c
za sym._dl_malloc R X2RsX21hbGxvYw==
za sym._dl_malloc t void sym._dl_malloc (int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg_10h)
za sym._dl_malloc r sym._dl_dprintf sym._dl_dprintf sym._dl_dprintf
za sym._dl_malloc v fs-4:var_4h:int32_t, fs-12:var_24h:int32_t, fs-16:var_20h:int32_t, fs-20:var_1ch:int32_t, fs-8:var_28h:int32_t, fs-24:var_18h:int32_t, fs-32:var_10h:int32_t, fs-80:var_10h_2:int32_t, fs-76:var_14h:int32_t, tb16:arg_10h:int32_t, fs-28:var_24h_2:int32_t, fs-36:var_1ch_2:int32_t, fs-40:var_18h_2:int32_t, tr4:arg1:int32_t, tr6:arg3:int32_t, tr7:arg4:int32_t, tr5:arg2:int32_t
za sym._dl_malloc h ec986971438cf486e01f14e9bc442d9f4c457854207d30fe4aa9f1ffdf892911
EOF
RUN

NAME=MIPS R3000  r_sign_fcn_bytes bounds check
FILE=bins/elf/libc.so.0
CMDS=<<EOF
s 0x00051490
af
e zign.maxsz = 41
zaf
z* ~za sym.fpathconf b
EOF
EXPECT=<<EOF
za sym.fpathconf b 3c1c0005279c11200399e02127bdfef8afbf0100afb100fcafb000f8afbc001004810008008088218f:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff
EOF
RUN

NAME=PowerPC function with hole
FILE=bins/elf/busybox-powerpc
CMDS=<<EOF
s 0x100e2b0c
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za fcn.100e2b0c b 38c000014800000c38c00000480000049421ffd07c0802a63d401013bf2100147c9923787cbe2b787cda33787c7f1b7890010034480000083bff0001897f0000812aa39c5560083c7c09022e700900204082ffe82f8b002b419e00182f8b002d3b80000040be00143b800001480000083b8000003bff000157c007357c6a1b7840820044881f00003bde000a2f80003040be00288c1f00013bdefffe600000207feafb785400063e2f80007840be000c57de083c3bff00012f9e0010409d00083bc00010381efffe390000002b800022419d00943800ffff7fa0f3967c1df1d67c0000f8541b063e480000087feafb78893f00007c08e8407c88e8003bff00013809ffd061290020540b063e2b0900602b8b0009409d00143929ffa93960002840990008552b063e7f8bf000409c00384181001040a600247f8bd840409d001c4bfe70057f9cd038380000223900ffff900300004bffff987c08f1d67d0b02144bffff8c:ffffffffff0000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff000000ffffffffff00000000000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000
za fcn.100e2b0c g cc=6 nbbs=17 edges=23 ebbs=0 bbsum=344
za fcn.100e2b0c o 0x100e2b0c
za fcn.100e2b0c R ZmNuLjEwMGUyYjBj
za fcn.100e2b0c t void fcn.100e2b0c (int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg_0h, int32_t arg_1h)
za fcn.100e2b0c v tb0:arg_0h:int32_t, tb1:arg_1h:int32_t, tr6:arg2:int32_t, tr7:arg3:int32_t, tr5:arg1:int32_t
za fcn.100e2b0c h d965748ce310bc40814dc20fd6e233a7131706af48e2f21ac93f7c0c5ab5bbd1
EOF
RUN

NAME=PowerPC function with jumpback
FILE=bins/elf/busybox-powerpc
# it's broken because (git)capstone-v5 vs (release)capstone-5.0 differ and break the testsuite
BROKEN=1
CMDS=<<EOF
s 0x10002d70
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za fcn.10002d70 b 38a0000038c000004bfffed4:ffffffffffffffffff000000
za fcn.10002d70 g cc=3 nbbs=8 edges=9 ebbs=1 bbsum=232
za fcn.10002d70 o 0x10002d70
za fcn.10002d70 t void fcn.10002d70 (int32_t arg1, int32_t arg2, int32_t arg_1030h, int32_t arg_1034h)
za fcn.10002d70 v fs-4136:var_8h:int32_t, ts4:arg_1034h:int32_t, fs-36:var_100ch:int32_t, ts0:arg_1030h:int32_t, fb-4096:var_1000h:int32_t, tr5:arg1:int32_t, tr6:arg2:int32_t
za fcn.10002d70 h 5f59f157d9e3548e81fed794bff828e7fc6ab90932a879b643d6d2a30c20c3b0
EOF
RUN

NAME=PowerPC r_sign_fcn_bytes bounds check
FILE=bins/elf/busybox-powerpc
CMDS=<<EOF
s 0x1000016c
af
e zign.maxsz = 30
zaf
z* ~za fcn.1000016c b
EOF
EXPECT=<<EOF
za fcn.1000016c b 3d2000007c0802a6392900009421fff02f89000090010014419e001c3c80
EOF
RUN

NAME=ARM function with hole
FILE=bins/elf/libmagic.so
CMDS=<<EOF
s 0x78ea
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym._Unwind_VRS_Get b 10b5041c042913d8081c00f072fd05031103030001200ce00220002b09d10f2a07d88240a418029a61681160181c00e0022010bd:ffffffffff00ff00ffffff000000ffffffffffffffffff00000000000000000000000000000000000000000000000000ffffffff
za sym._Unwind_VRS_Get g cc=2 nbbs=4 edges=4 ebbs=1 bbsum=28
za sym._Unwind_VRS_Get o 0x000078ea
za sym._Unwind_VRS_Get R X1Vud2luZF9WUlNfR2V0
za sym._Unwind_VRS_Get t void sym._Unwind_VRS_Get (int16_t arg1, int16_t arg2)
za sym._Unwind_VRS_Get r sym.__gnu_thumb1_case_uqi
za sym._Unwind_VRS_Get v tr0:arg1:int16_t, tr1:arg2:int16_t
za sym._Unwind_VRS_Get h 3132d0ebfa3b792867a4ffc36455e088bf3fcffc7627bd48c64bf901308463db
EOF
RUN

NAME=ARM function with jumpback
FILE=bins/elf/libverifyPass.so
CMDS=<<EOF
s 0x0000183c
af
zaf
z* ~sym.__aeabi_unwind_cpp_pr0 b
EOF
EXPECT=<<EOF
za sym.__aeabi_unwind_cpp_pr0 b 0030a0e3d4feffea:ffffffffff000000
EOF
RUN

NAME=ARM r_sign_fcn_bytes bounds check
FILE=bins/elf/libverifyPass.so
CMDS=<<EOF
s 0x00001844
af
e zign.maxsz = 42
zaf
z* ~za fcn.00001844 b
EOF
EXPECT=<<EOF
za fcn.00001844 b f04f2de9a8519fe5a8319fe505508fe0033095e714d04de2000053e30040a0e1026041e20800000a0600:ffffffffff000000ff000000ffffffffffffffffffffffffff000000ffffffffffffffffff000000ffff
EOF
RUN

NAME=ARM aarch64 function with hole
FILE=bins/elf/switch-hello-world.elf
CMDS=<<EOF
s 0x12180
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym.memset b 200c014e0400028b5f8001f1c80300545f4000f102020054013c084ea2001836010000f981801ff8c0035fd61f2003d582001036010000b981c01fb8c0035fd6820000b4010000394200083681e01f78c0035fd60000803dc200303780009f3c620028360004803d80009e3cc0035fd60004803d000001ad80003fadc0035fd61f2003d5211c001203ec7c920000803d5f0004f12028407a80010054820003cb634000d1424001d1600001ad600082ad420001f1a8ffff5480003ead80003fadc0035fd61f2003d5e5003bd585fe2737a50c0012bf100071810200546004803d600001ad63e47a92600002ad600003ad820003cb420004d1630002911f2003d523740bd563000191420001f1a8ffff54600000ad600001ad80003ead80003fadc0035fd61f2003d5bf140071410200546004803d600001ad600002ad600003ad63e07992820003cb420004d16300029123740bd563000291420002f1a8ffff5480003cad80003dad80003ead80003fadc0035fd686008052c720c51ae50001915f0005ebc3f8ff54e60400d16500078b63400091a20003eba500268aa0000054600082ac60003fad420001f1a8ffff54e30305aa820005cb420007eba300005423740bd56300078b420007eba2ffff544200078b638000d1b6ffff17:ffffffffffffffffffffffffff000000ffffffffff000000ffffffffff000000ffffffffffffffffffffffff00000000ff000000ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff00000000ffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff00000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffff000000ffffffffffffffffff000000
za sym.memset g cc=28 nbbs=35 edges=47 ebbs=8 bbsum=460
za sym.memset o 0x00012180
za sym.memset R bWVtc2V0
za sym.memset t void sym.memset (void *s, int c, size_t n)
za sym.memset v tr10:c:int, tr6:s:void *, tr14:n:size_t
za sym.memset h 82e8b18bbf263f9ed0e31d6b68099efe6eb8805a429444f8aa119af00c47369c
EOF
RUN

NAME=ARM aarch64 function with jmpback
FILE=bins/elf/switch-hello-world.elf
CMDS=<<EOF
s 0x131a4
af
zaf
z*
EOF
EXPECT=<<EOF
zs *
za sym.strnlen b c1ffffb4ecc300b202ec7c92080c40f2610300542e0400d1cefd44d34310c1a868000ccb69d800b28a000ccb8bd800b20601298a47012b8ace0500f1c80007aa005940fac0feff54c80007aa68fdffb4400000cb660000b4002000d1e70306aa002000d1e70cc0daed10c0da000c4d8b1f0001eb0090819ac0035fd62e0400d1eb0308cb1f2100f1ca0d4092cefd44d3090080924310c1a86bf17dd34a01088b2925cb9ace114a8b630009aa850009aa63d09fda84d0859adaffff17:ff000000ffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
za sym.strnlen g cc=7 nbbs=11 edges=14 ebbs=2 bbsum=196
za sym.strnlen o 0x000131a4
za sym.strnlen R c3Rybmxlbg==
za sym.strnlen t void sym.strnlen (int64_t arg1, int64_t arg2, int64_t arg5)
za sym.strnlen v tr10:arg2:int64_t, tr6:arg1:int64_t, tr22:arg5:int64_t
za sym.strnlen h c573e9053dfa735f51cca8aea51eda71ca46fd402d11feb4d7f8ccf1b3b46d72
EOF
RUN

NAME=ARM aarch64 r_sign_fcn_bytes bounds check
FILE=bins/elf/switch-hello-world.elf
CMDS=<<EOF
s 0x00016e9c
e zign.maxsz = 94
af
zaf
z* ~za sym._vfprintf_r b
EOF
EXPECT=<<EOF
za sym._vfprintf_r b ff0314d1fd7b00a9fd030091f35301a9f30302aaf55b02a9f76303a9f70300aaf80303aaf96b04a9fa0301aafb7305a9e827066d6a170094000040f9e06700f989efff97e05700f9020180d2e0a3059101008052a4ecff97b70000b4e052:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff000000ff000000ffff
EOF
RUN

NAME=zbr bad count
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact NOTNUMBER
EOF
EXPECT=<<EOF
EOF
RUN

NAME=zbr negative count
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact -3
EOF
EXPECT=<<EOF
EOF
RUN

NAME=zbr zero count
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact 0
EOF
EXPECT=<<EOF
EOF
RUN

NAME=zbr single match
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact 1~[5]
EOF
EXPECT=<<EOF
fcn.00410210
EOF
RUN

NAME=zbr exact match
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact 1
EOF
EXPECT=<<EOF
1.00000  1.00000 B  1.00000 G   fcn.00410210
EOF
RUN

NAME=zbrj exact match
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbrj sym.exact 1
EOF
EXPECT=<<EOF
[{"name":"fcn.00410210","similarity":1.000,"byte similarity":1.000,"graph similarity":1.000}]
EOF
RUN

NAME=zbr try match 5 but only 4
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact ~[5]
EOF
EXPECT=<<EOF
fcn.00410210
main
entry0
fcn.00400de0
EOF
RUN

NAME=zbr match 5 by default
FILE=bins/elf/ls
CMDS=<<EOF
aa
e zign.maxsz = 32
za main b 41574156415541545589fd534889f34883ec58488b3e64488b04252800000048
za main g cc=429 nbbs=300 edges=437 ebbs=8 bbsum=6739
zbr main ~[5]
EOF
EXPECT=<<EOF
main
sym._obstack_newchunk
sym._obstack_free
sym._obstack_begin
sym._obstack_begin_1
EOF
RUN

NAME=zbr ignore masked bytes
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
aa
e zign.maxsz = 32
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e8aaaaaaaa488baaaaaaaaaa4889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zbr sym.exact 1
EOF
EXPECT=<<EOF
1.00000  1.00000 B  1.00000 G   fcn.00410210
EOF
RUN

NAME=zb zign.threshold
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.1 g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.1 b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.2 g cc=16 nbbs=25 edges=40 ebbs=1 bbsum=377
za sym.2 b 41544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.3 g cc=14 nbbs=21 edges=35 ebbs=1 bbsum=347
za sym.3 b fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.4 g cc=12 nbbs=17 edges=30 ebbs=1 bbsum=307
za sym.4 b 4883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffff00000000ff000000000000ffffffffffffff
za sym.5 g cc=10 nbbs=14 edges=22 ebbs=1 bbsum=284
za sym.5 b 08e89e02ffff488b2d77952a004889c38b450048:ffff00000000ff000000000000ffffffffffffff
e zign.threshold = .99
zb ~[5]
e zign.threshold = .9
zb ~[5]
e zign.threshold = .8
zb ~[5]
e zign.threshold = .7
zb ~[5]
EOF
EXPECT=<<EOF
sym.1
sym.1
sym.2
sym.1
sym.2
sym.3
sym.1
sym.2
sym.3
sym.4
EOF
RUN

NAME=zbr zign.threshold
FILE=bins/elf/ls
CMDS=<<EOF
aa
e zign.maxsz = 32
za main b 41574156415541545589fd534889f34883ec58488b3e64488b04252800000048
za main g cc=429 nbbs=300 edges=437 ebbs=8 bbsum=6739
e zign.threshold = 1.0
zbr main~[5]
e zign.threshold = 0.5
zbr main~[5]
e zign.threshold = 0.3
zbr main~[5]
e zign.threshold = 0.12
zbr main 30~[5]
EOF
EXPECT=<<EOF
main
main
main
main
sym._obstack_newchunk
EOF
RUN

NAME=zbr invalid threshold
FILE=bins/elf/ls
CMDS=<<EOF
aa
e zign.maxsz = 32
e zign.threshold = 99.0
za main b 41574156415541545589fd534889f34883ec58488b3e64488b04252800000048
za main g cc=429 nbbs=300 edges=437 ebbs=8 bbsum=6739
zbr main ~[5]
EOF
EXPECT=<<EOF
main
sym._obstack_newchunk
sym._obstack_free
sym._obstack_begin
sym._obstack_begin_1
EOF
RUN

NAME=zb invalid threshold
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.threshold = 99.0
e zign.maxsz = 32
af
za sym.exact g cc=17 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.exact b 415541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.second g cc=16 nbbs=29 edges=44 ebbs=1 bbsum=407
za sym.second b ff5541544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.third g cc=16 nbbs=28 edges=44 ebbs=1 bbsum=407
za sym.third b ffff41544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fourth g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=407
za sym.fourth b ffffff544989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.fith g cc=16 nbbs=28 edges=43 ebbs=1 bbsum=401
za sym.fith b ffffffff4989fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
za sym.not_shown g cc=15 nbbs=28 edges=43 ebbs=1 bbsum=395
za sym.not_shown b ffffffffff89fc55534883ec08e89e02ffff488b2d77952a004889c38b450048:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zb ~[5]
EOF
EXPECT=<<EOF
sym.exact
sym.second
sym.third
sym.fourth
sym.fith
EOF
RUN

NAME=manually add signatures
FILE=-
CMDS=<<EOF
zs *
za main b 41574156415541544189fc554889f5534883ec48488b3e64488b042528000000488944243831c067e8b3f40000488d35b6570100bf06000000ff1531ee0100488d3500590100488d3dc4580100ff1565ec0100488d3db7580100ff1538ec0100488d3d499e0000c705e7f001000200000067e899320100c6059a0102000148b80000000000000080488905410202008b05abf00100c705d10002000000000048c705360202000000000048c70523020200ffffffffc6057c0102000083f8020f849c0e000083f8030f85da010000c705c001020000000000be0700000031ff67e81b0a0100c605a301020000488d3d65580100c7059701020000000000c7058901020000000000c6057f01020000c6057701020000c7055501020000000000c6053601020000c7052801020001000000c6051f01020000c6051701020000c705080102000000000048c705f50002000000000048c705e200020000000000c6056001020000ff1575ea01004989c54885c07438b904000000488d15618a0100488d35dae701004889c767e84192000085c00f880c0900004898488d15408a010031ff8b348267e85509010048c7055a00020050000000488d3da9570100ff151dea01004989c54885c074098038000f85060900004c8d6c242031c0be13540000bf010000004c89eaff156aeb010083f8ff740e0f:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff000000000000ffffffffffff0000000000ff000000000000ff000000000000ff0000000000ff000000000000ff0000000000ff000000000000ff000000000000000000ffff00000000ff000000000000ffffffffffffffffffffff000000000000ff0000000000ff000000000000000000ff00000000000000000000ff00000000000000000000ff000000000000ff0000ffff00000000ff0000ffff00000000ff000000000000000000ffffffffffffffffff00000000ff000000000000ff000000000000ff000000000000000000ff000000000000000000ff000000000000ff000000000000ff000000000000000000ff000000000000ff000000000000000000ff000000000000ff000000000000ff000000000000000000ff00000000000000000000ff00000000000000000000ff000000000000ff0000000000ffffffffffffff00ffffffffffff000000000000ff000000000000ffffffffff00000000ffffffff00000000ffffff000000000000ffffffffffffff00000000ff00000000000000000000ff000000000000ff0000000000ffffffffffffff00ffffffffff00000000ffffffffffffffff00000000ffffffffffffffffff0000000000ffffffff00ff
za main g cc=147 nbbs=226 edges=355 ebbs=8 bbsum=4859
za main o 0x000040a0
za main r sym._obstack_begin sym._obstack_begin sym._obstack_begin
za main v fs-64:a:int64_t, ts-88:arg3:char ***, tr78:wooo:size_t, tr82:arg1:int
za main t int main (int argc, char ** argv, char **envp)
za main h c82a35182e4217e7d7a4662c066be72bff254100ad71e29492350dba46fad184
z*
EOF
EXPECT=<<EOF
zs *
za main b 41574156415541544189fc554889f5534883ec48488b3e64488b042528000000488944243831c067e8b3f40000488d35b6570100bf06000000ff1531ee0100488d3500590100488d3dc4580100ff1565ec0100488d3db7580100ff1538ec0100488d3d499e0000c705e7f001000200000067e899320100c6059a0102000148b80000000000000080488905410202008b05abf00100c705d10002000000000048c705360202000000000048c70523020200ffffffffc6057c0102000083f8020f849c0e000083f8030f85da010000c705c001020000000000be0700000031ff67e81b0a0100c605a301020000488d3d65580100c7059701020000000000c7058901020000000000c6057f01020000c6057701020000c7055501020000000000c6053601020000c7052801020001000000c6051f01020000c6051701020000c705080102000000000048c705f50002000000000048c705e200020000000000c6056001020000ff1575ea01004989c54885c07438b904000000488d15618a0100488d35dae701004889c767e84192000085c00f880c0900004898488d15408a010031ff8b348267e85509010048c7055a00020050000000488d3da9570100ff151dea01004989c54885c074098038000f85060900004c8d6c242031c0be13540000bf010000004c89eaff156aeb010083f8ff740e0f:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff000000000000ffffffffffff0000000000ff000000000000ff000000000000ff0000000000ff000000000000ff0000000000ff000000000000ff000000000000000000ffff00000000ff000000000000ffffffffffffffffffffff000000000000ff0000000000ff000000000000000000ff00000000000000000000ff00000000000000000000ff000000000000ff0000ffff00000000ff0000ffff00000000ff000000000000000000ffffffffffffffffff00000000ff000000000000ff000000000000ff000000000000000000ff000000000000000000ff000000000000ff000000000000ff000000000000000000ff000000000000ff000000000000000000ff000000000000ff000000000000ff000000000000000000ff00000000000000000000ff00000000000000000000ff000000000000ff0000000000ffffffffffffff00ffffffffffff000000000000ff000000000000ffffffffff00000000ffffffff00000000ffffff000000000000ffffffffffffff00000000ff00000000000000000000ff000000000000ff0000000000ffffffffffffff00ffffffffff00000000ffffffffffffffff00000000ffffffffffffffffff0000000000ffffffff00ff
za main g cc=147 nbbs=226 edges=355 ebbs=8 bbsum=4859
za main o 0x000040a0
za main t int main (int argc, char ** argv, char **envp)
za main r sym._obstack_begin sym._obstack_begin sym._obstack_begin
za main v fs-64:a:int64_t, ts-88:arg3:char ***, tr78:wooo:size_t, tr82:arg1:int
za main h c82a35182e4217e7d7a4662c066be72bff254100ad71e29492350dba46fad184
EOF
RUN

NAME=add types and function name on sig match
FILE=bins/elf/ls
CMDS=<<EOF
zs *
za main o 0x00004070
za main t int sym.new_function_name (int NEWARGC, char **NEWARGV)
za main n sym.new_function_name
s main
af
e zign.offset = true
z.
afs
afn
EOF
EXPECT=<<EOF
int sym.new_function_name (int NEWARGC, char **NEWARGV);
sym.new_function_name
EOF
RUN

NAME=zd basic
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00410210
e zign.maxsz = 32
af
za sym.test b ff41554154498afc555383ec08e89e02ffff488b2d77952a004889c38b450045:ffffffffffffffffffffffffffff00000000ff000000000000ffffffffffffff
zd sym.test
EOF
EXPECT=<<EOF
Fnc cmp   0x0000       41  55  41  54  49  89  fc  55  53 -48  83  ec  08  e8  00
Sig cmp   0x0000  +ff  41  55  41  54  49 ^8a  fc  55  53      83  ec  08  e8  00
Fnc Mask  0x0000       ff  ff  ff  ff  ff  ff  ff  ff  ff -ff  ff  ff  ff  ff  00
Sig Mask  0x0000  +ff  ff  ff  ff  ff  ff ^ff  ff  ff  ff      ff  ff  ff  ff  00
Fnc Bytes 0x0000       41  55  41  54  49  89  fc  55  53 -48  83  ec  08  e8  9e
Sig Bytes 0x0000  +ff  41  55  41  54  49 ^8a  fc  55  53      83  ec  08  e8  9e

Fnc cmp   0x000f   00  00  00  48  00  00  00  00  00  00  48  89  c3  8b  45  00
Fnc Mask  0x000f   00  00  00  ff  00  00  00  00  00  00  ff  ff  ff  ff  ff  ff
Fnc Bytes 0x000f   02  ff  ff  48  8b  2d  77  95  2a  00  48  89  c3  8b  45  00
== Signature was same ==

Fnc cmp   0x001f   48
Sig cmp   0x001f  ^45
Fnc Mask  0x001f   ff
Sig Mask  0x001f  ^ff
Fnc Bytes 0x001f   48
Sig Bytes 0x001f  ^45
EOF
RUN

NAME=verify za overwrites old
FILE=-
CMDS=<<EOF
za main b 11111111111111111111111111111111
za main n sym.name1
za main g cc=1 nbbs=1 edges=1 ebbs=1 bbsum=1
za main o 0x11111111
za main r ref1
za main x xref1
za main h 1111111111111111111111111111111111111111111111111111111111111111
za main v fs-64:nope:int64_t
za main b 22222222222222222222222222222222
za main n sym.name2
za main g cc=2 nbbs=2 edges=2 ebbs=2 bbsum=2
za main o 0x22222222
za main r ref2
za main x xref2
za main h 2222222222222222222222222222222222222222222222222222222222222222
za main v fs-64:yup:int64_t
z
EOF
EXPECT=<<EOF
main:
  bytes: 22222222222222222222222222222222
  mask: ffffffffffffffffffffffffffffffff
  graph: cc=2 nbbs=2 edges=2 ebbs=2 bbsum=2
  addr: 0x22222222
  realname: sym.name2
  rawname: main
  demangled: sym.name1
  refs: ref2
  xrefs: xref2
  vars: fs-64:yup:int64_t
  bbhash: 2222222222222222222222222222222222222222222222222222222222222222
EOF
RUN

NAME=zac creates collision signatures
FILE=-
CMDS=<<EOF
za sym.collide1 g cc=1 nbbs=2 edges=3 ebbs=4 bbsum=5
za sym.collide1 b 4433444444444444:ff00ffffffffffff
za sym.collide2 g cc=1 nbbs=2 edges=3 ebbs=4 bbsum=5
za sym.collide3 g cc=1 nbbs=2 edges=3 ebbs=4 bbsum=5
za sym.collide2 b 4422444444444444:ff00ffffffffffff
za sym.collide4 g cc=1 nbbs=2 edges=3 ebbs=4 bbsum=5
za sym.collide5 g cc=1 nbbs=2 edges=3 ebbs=4 bbsum=5
za sym.other1 g cc=0 nbbs=2 edges=3 ebbs=4 bbsum=5
za sym.other1 b 4422444444444445:ff00ffffffffffff
za sym.other2 g cc=2 nbbs=2 edges=3 ebbs=4 bbsum=5
zac
z*~sym.collide1 C
z*~sym.collide2 C
EOF
EXPECT=<<EOF
za sym.collide1 C b:sym.collide2 g:sym.collide2 g:sym.collide3 g:sym.collide4 g:sym.collide5
za sym.collide2 C b:sym.collide1 g:sym.collide1 g:sym.collide3 g:sym.collide4 g:sym.collide5
EOF
RUN

NAME=collisions detected and prevents renaming function
FILE=bins/elf/ls
CMDS=<<EOF
s main
af
afn badname
zaf
afn badname2
f-badname
zaf
afn main
f-badname2
af- $$
zac
z/
afl~main?
zi~sign.bytes_func_collision.badname_1?
zi~sign.graph_collision.badname_1?
zi~sign.bytes_func_collision.badname_1?
zi~sign.graph_func_collision.badname2_1?
EOF
EXPECT=<<EOF
1
1
0
1
0
EOF
RUN

NAME=Rename when collision intersection unique
FILE=bins/elf/ls
CMDS=<<EOF
s main
af
afn newname
zaf
f- newname
afn badbytes
zaf
za badbytes b 444444
f- badbytes
afn badgraph
zaf
za badgraph g cc=100 nbbs=2 edges=3 ebbs=8 bbsum=100
afn main
f- badgraph
af- main
zac
z/
afl~newname?
EOF
EXPECT=<<EOF
1
EOF
RUN

NAME=zaF vs zaM
FILE=bins/elf/analysis/zigs
CMDS=<<EOF
aa
zg
f test_orig_size = `z~?`
zaM
?v test_orig_size - `z~?`
zaF
?v test_orig_size - `z~?`~0x0?
EOF
EXPECT=<<EOF
0x0
1
EOF
RUN

NAME=Rename vars on sign match
FILE=bins/elf/ls
CMDS=<<EOF
s main
af
za new_main b 41574156415541545589fd534889f34883ec58488b3e64488b042528000000488944244831c067e8e4e40000488d351e480100bf06000000ff155ade0100488d354d490100488d3d2c490100ff158edc0100488d3d1f490100ff1561dc0100488d3d9a900000c70518e101000200000067e88a260100c605cbf101000148b8000000000000008048890572f201008b05dce00100c70502f101000000000048c70567f201000000000048c70554f20100ffffffffc605adf101000083f8020f84580e000083f8030f85e3010000c705f1f1010000000000be0700000031ff67e8fcfa0000c605d4f1010000488d3db2480100c705c8f1010000000000c705baf1010000000000c605b0f1010000c605a8f1010000c70586f1010000000000c60567f1010000c70559f1010001000000c60550f1010000c60548f1010000c70539f101000000000048c70526f101000000000048c70513f1010000000000c60591f1010000ff159eda01004989c44885c07438b904000000488d1592770100488d354bd801004889c767e86284000085c00f88df0800004898488d157177010031ff8b348267e836fa000048c7058bf0010050000000488d3df6470100ff1546da01004989c44885c074098038000f85d90800004c8d64243031c0be13540000bf010000004c89e2ff159bdb010083f8ff740e0fb7:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff000000000000ffffffffffff0000000000ff000000000000ff000000000000ff0000000000ff000000000000ff0000000000ff000000000000ff000000000000000000ffff00000000ff000000000000ffffffffffffffffffffff000000000000ff0000000000ff000000000000000000ff00000000000000000000ff00000000000000000000ff000000000000ff0000ffff00000000ff0000ffff00000000ff000000000000000000ffffffffffffffffff00000000ff000000000000ff000000000000ff000000000000000000ff000000000000000000ff000000000000ff000000000000ff000000000000000000ff000000000000ff000000000000000000ff000000000000ff000000000000ff000000000000000000ff00000000000000000000ff00000000000000000000ff000000000000ff0000000000ffffffffffffff00ffffffffffff000000000000ff000000000000ffffffffff00000000ffffffff00000000ffffff000000000000ffffffffffffff00000000ff00000000000000000000ff000000000000ff0000000000ffffffffffffff00ffffffffff00000000ffffffffffffffff00000000ffffffffffffffffff0000000000ffffffff00ffff
za new_main v fs-64:XXX_48h:int64_t, fs-88:XXX_30h:int64_t, fs-113:XXX_17h:int64_t, fs-128:XXX_8h:int64_t, fs-96:XXX_28h:int64_t, fs-80:XXX_38h:int64_t, fs-67:XXX_45h:int64_t, fs-65:XXX_47h:int64_t, fs-66:XXX_46h:int64_t, fs-112:XXX_18h:int64_t, fs-86:XXX_32h:int64_t, tr83:ARGC:int, tr79:ARGV:char **
z/f
afv
EOF
EXPECT=<<EOF
arg int ARGC @ rdi
arg char ** ARGV @ rsi
var int64_t XXX_8h @ rsp+0x18
var int64_t XXX_17h @ rsp+0x27
var int64_t XXX_18h @ rsp+0x28
var int64_t XXX_28h @ rsp+0x38
var int64_t XXX_30h @ rsp+0x40
var int64_t XXX_32h @ rsp+0x42
var int64_t XXX_38h @ rsp+0x48
var int64_t XXX_45h @ rsp+0x55
var int64_t XXX_46h @ rsp+0x56
var int64_t XXX_47h @ rsp+0x57
var int64_t XXX_48h @ rsp+0x58
EOF
RUN

NAME=Types with . accepted
FILE=-
CMDS=<<EOF
za foo t void sym.__isoc99_sscanf (  ..., int64_t arg4, int64_t arg5, int64_t arg6, int64_t arg7, int64_t arg8 )
z
EOF
EXPECT=<<EOF
foo:
  types: void sym.__isoc99_sscanf (  ..., int64_t arg4, int64_t arg5, int64_t arg6, int64_t arg7, int64_t arg8 )
EOF
RUN

NAME=Types with parens accepted
FILE=-
CMDS=<<EOF
za foo t void sym.bsearch (const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *const void *))
z
EOF
EXPECT=<<EOF
foo:
  types: void sym.bsearch (const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *const void *))
EOF
RUN

NAME=Only one "bytes" flag created on match
FILE=bins/elf/ls
CMDS=<<EOF
za sym._obstack_begin_1 b 804f500148894f384c8947404c894f48e93bffffff:ffffffffffffffffffffffffffffffffff00000000
z/
f~?sign.bytes.
EOF
EXPECT=<<EOF
1
EOF
RUN

NAME=Mangled zignatures
FILE=bins/mach0/mangled
CMDS=<<EOF
e zign.mangled=true
aa
zg
z*~N
?e --
z-*
e zign.mangled=false
zg
z*~N
EOF
EXPECT=<<EOF
za sym.foo_int__int_ R ZnVuYy4xMDAwMDNlZjQ=
za sym.foo_int__int_ N main
za sym.foo__ R ZnVuYy4xMDAwMDNlZDQ=
za sym.foo__ N sym.foo_int_
za main R ZnVuYy4xMDAwMDNmMmM=
za main N sym.imp.atoi
za sym.foo_int_ R ZnVuYy4xMDAwMDNlZGM=
za sym.foo_int_ N sym.foo_int__int_
--
za func.100003f2c R ZnVuYy4xMDAwMDNmMmM=
za func.100003f2c N atoi
za func.100003ed4 R ZnVuYy4xMDAwMDNlZDQ=
za func.100003ed4 N func.100003edc
za func.100003edc R ZnVuYy4xMDAwMDNlZGM=
za func.100003edc N func.100003ef4
za func.100003ef4 R ZnVuYy4xMDAwMDNlZjQ=
za func.100003ef4 N func.100003f2c
EOF
RUN

NAME=Saves and loads sdb zignatures without sdb extension
FILE=-
CMDS=<<EOF
rm .tmp_file
za s1 x xref1
za s2 r ref1
za s3 n sym1
za s4 n sym2
zos .tmp_file
z-*
zo .tmp_file
z~s1
z~s2
z~s3
z~s4
rm .tmp_file
EOF
EXPECT=<<EOF
s1:
s2:
s3:
  rawname: s3
s4:
  rawname: s4
EOF
RUN

NAME=Saves and loads r2 zignatures without r2 extension
FILE=-
CMDS=<<EOF
rm .tmp_file2
za s1 x xref1
za s2 r ref1
za s3 n sym1
za s4 n sym2
z* > .tmp_file2
z-*
zo .tmp_file2
z~s1
z~s2
z~s3
z~s4
rm .tmp_file2
EOF
EXPECT=<<EOF
s1:
s2:
s3:
  rawname: s3
s4:
  rawname: s4
EOF
RUN

NAME=Generate zignature and show only one
FILE=bins/elf/arg
CMDS=<<EOF
aa
zg
z $$
aflc
EOF
EXPECT=<<EOF
_start:
  bytes: 31ed4989d15e4889e24883e4f050544c8d053a020000488d0dc3010000488d3d5a010000ff1516092000
  mask: ffffffffffffffffffffffffffffffff000000000000ff000000000000ff000000000000ff0000000000
  graph: cc=1 nbbs=1 edges=0 ebbs=1 bbsum=42
  addr: 0x000006a0
  realname: _start
  rawname: _start
  next: deregister_tm_clones
  types: void entry0 (int64_t arg3)
  refs: sym.__libc_csu_fini, sym.__libc_csu_init, sym.main
  vars: tr73:arg3:int64_t
  bbhash: 77ece050bbc234ae3b587a8ef8da536b640f0b000414d63490214c47b18021d2
18
EOF
RUN
