Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
cwe_checker
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-gitdep
cwe_checker
Commits
fd91fb5c
Unverified
Commit
fd91fb5c
authored
Jul 16, 2020
by
Melvin Klimke
Committed by
GitHub
Jul 16, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extended cconv tests (#69)
parent
111ab158
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
259 additions
and
21 deletions
+259
-21
cconv.ml
src/utils/cconv.ml
+2
-0
Makefile
test/unit/Makefile
+7
-1
unit_tests_cwe_checker.ml
test/unit/unit_tests_cwe_checker.ml
+22
-1
cconv_test.ml
test/unit/utils/cconv_test.ml
+222
-19
cconv_test.mli
test/unit/utils/cconv_test.mli
+6
-0
No files found.
src/utils/cconv.ml
View file @
fd91fb5c
...
@@ -79,6 +79,8 @@ let get_register_list (project : Project.t) (context : string) : string list =
...
@@ -79,6 +79,8 @@ let get_register_list (project : Project.t) (context : string) : string list =
let
arch
=
match
bap_arch
with
let
arch
=
match
bap_arch
with
|
"i386"
|
"i686"
->
"x86"
|
"i386"
|
"i686"
->
"x86"
|
"powerpc"
->
"ppc"
|
"powerpc"
->
"ppc"
|
"powerpc64"
->
"ppc64"
|
"powerpc64le"
->
"ppc64le"
|
_
->
bap_arch
in
|
_
->
bap_arch
in
match
Stdlib
.
List
.
mem
arch
(
get_supported_architectures
()
)
with
match
Stdlib
.
List
.
mem
arch
(
get_supported_architectures
()
)
with
|
true
->
begin
|
true
->
begin
...
...
test/unit/Makefile
View file @
fd91fb5c
...
@@ -2,7 +2,13 @@ all:
...
@@ -2,7 +2,13 @@ all:
bapbundle remove unit_tests_cwe_checker.plugin
bapbundle remove unit_tests_cwe_checker.plugin
bapbuild
-r
-Is
analysis,checkers,utils unit_tests_cwe_checker.plugin
-pkgs
alcotest,yojson,unix,ppx_jane,cwe_checker_core
bapbuild
-r
-Is
analysis,checkers,utils unit_tests_cwe_checker.plugin
-pkgs
alcotest,yojson,unix,ppx_jane,cwe_checker_core
bapbundle install unit_tests_cwe_checker.plugin
bapbundle install unit_tests_cwe_checker.plugin
bap tmp/arrays_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
MemRegion,Cconv,TypeInference,CWE476
bap tmp/arrays_x86_64-w64-mingw32_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
Cconv
bap tmp/arrays_i686-w64-mingw32_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
Cconv
bap tmp/arrays_x86_clang.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
Cconv
bap tmp/arrays_arm_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
Cconv
bap tmp/arrays_mips64_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
Cconv
bap tmp/arrays_powerpc_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
Cconv
bap tmp/arrays_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
MemRegion,TypeInference,CWE476
bap tmp/c_constructs_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
CWE560,AddrTrans
bap tmp/c_constructs_gcc.out
--pass
=
unit-tests-cwe-checker
--unit-tests-cwe-checker-tests
=
CWE560,AddrTrans
bapbundle remove unit_tests_cwe_checker.plugin
bapbundle remove unit_tests_cwe_checker.plugin
...
...
test/unit/unit_tests_cwe_checker.ml
View file @
fd91fb5c
...
@@ -37,11 +37,32 @@ let unit_test_list = [
...
@@ -37,11 +37,32 @@ let unit_test_list = [
]
]
let
check_for_cconv
(
project
:
Project
.
t
)
(
arch
:
string
)
=
match
arch
with
|
"i386"
|
"i686"
->
Cconv_test
.
example_cconv
:=
Project
.
get
project
Bap_abi
.
name
|
_
->
()
let
get_test_bin_format
(
project
:
Project
.
t
)
=
let
filename
=
match
(
Project
.
get
project
filename
)
with
|
Some
(
f
)
->
f
|
_
->
failwith
"Test file has no file name"
in
match
String
.
is_substring
filename
~
substring
:
"mingw32"
with
|
true
->
"pe"
|
false
->
"elf"
let
set_example_project
(
project
:
Project
.
t
)
(
tests
:
string
list
)
=
let
set_example_project
(
project
:
Project
.
t
)
(
tests
:
string
list
)
=
let
arch
=
Arch
.
to_string
(
Project
.
arch
project
)
in
List
.
iter
tests
~
f
:
(
fun
test
->
List
.
iter
tests
~
f
:
(
fun
test
->
match
test
with
match
test
with
|
"TypeInference"
->
Type_inference_test
.
example_project
:=
Some
(
project
)
|
"TypeInference"
->
Type_inference_test
.
example_project
:=
Some
(
project
)
|
"Cconv"
->
Cconv_test
.
example_project
:=
Some
(
project
)
|
"Cconv"
->
begin
Cconv_test
.
example_project
:=
Some
(
project
);
Cconv_test
.
example_arch
:=
Some
(
arch
);
check_for_cconv
project
arch
;
Cconv_test
.
example_bin_format
:=
Some
(
get_test_bin_format
project
)
end
|
"CWE476"
->
Cwe_476_test
.
example_project
:=
Some
(
project
)
|
"CWE476"
->
Cwe_476_test
.
example_project
:=
Some
(
project
)
|
_
->
()
|
_
->
()
)
)
...
...
test/unit/utils/cconv_test.ml
View file @
fd91fb5c
...
@@ -8,54 +8,257 @@ let check msg x = Alcotest.(check bool) msg true x
...
@@ -8,54 +8,257 @@ let check msg x = Alcotest.(check bool) msg true x
let
example_project
=
ref
None
let
example_project
=
ref
None
let
example_cconv
=
ref
None
let
example_arch
=
ref
None
let
example_bin_format
=
ref
None
let
test_callee_saved
()
=
let
test_callee_saved
()
=
(* this test assumes, that the example project is a x64 binary *)
(* this test assumes, that the example project is a x64 binary *)
let
project
=
Option
.
value_exn
!
example_project
in
let
project
=
Option
.
value_exn
!
example_project
in
let
register
=
Var
.
create
"RBX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
arch
=
Option
.
value_exn
!
example_arch
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
cconv
=
Option
.
value
!
example_cconv
~
default
:
""
in
let
register
=
Var
.
create
"R15"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
bin_format
=
Option
.
value_exn
!
example_bin_format
in
match
cconv
with
|
"cdecl"
|
"fastcall"
|
"stdcall"
|
"ms"
->
begin
let
register
=
Var
.
create
"EBX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"R
AX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
register
=
Var
.
create
"E
AX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"caller_saved_register"
(
is_callee_saved
register
project
=
false
)
in
let
()
=
check
"caller_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
""
->
begin
match
arch
with
|
"x86_64"
->
begin
match
bin_format
with
|
"pe"
->
begin
let
register
=
Var
.
create
"RDI"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"R8"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
register
=
Var
.
create
"R8"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"caller_saved_register"
(
is_callee_saved
register
project
=
false
)
in
let
()
=
check
"caller_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
()
end
|
"elf"
->
begin
let
register
=
Var
.
create
"RBX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"RDI"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"caller_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
_
->
failwith
"Not a valid binary format"
end
|
"mips"
|
"mipsel"
|
"mips64"
|
"mips64el"
->
begin
let
register
=
Var
.
create
"S0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"A0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
"armv4"
|
"armv5"
|
"armv6"
|
"armv7"
|
"armv4eb"
|
"armv5eb"
|
"armv6eb"
|
"armv7eb"
|
"thumbv4"
|
"thumbv5"
|
"thumbv6"
|
"thumbv7"
|
"thumbv4eb"
|
"thumbv5eb"
|
"thumbv6eb"
|
"thumbv7eb"
->
begin
let
register
=
Var
.
create
"R4"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"R0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
"aarch64"
->
begin
let
register
=
Var
.
create
"X18"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"X0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
"powerpc"
->
begin
let
register
=
Var
.
create
"R14"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"R4"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
"powerpc64"
|
"powerpc64le"
->
begin
let
register
=
Var
.
create
"R14"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
)
in
let
register
=
Var
.
create
"R10"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"callee_saved_register"
(
is_callee_saved
register
project
=
false
)
in
()
end
|
_
->
failwith
"Not a supported architecture"
end
|
_
->
failwith
"Not a supported calling convention"
let
test_parameter_register
()
=
let
test_parameter_register
()
=
(* this test assumes, that the example project is a x64 binary *)
(* this test assumes, that the example project is a x64 binary *)
let
project
=
Option
.
value_exn
!
example_project
in
let
project
=
Option
.
value_exn
!
example_project
in
let
register
=
Var
.
create
"RDX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
arch
=
Option
.
value_exn
!
example_arch
in
let
()
=
check
"return_register"
(
is_parameter_register
register
project
)
in
let
cconv
=
Option
.
value
!
example_cconv
~
default
:
""
in
let
register
=
Var
.
create
"R9"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
bin_format
=
Option
.
value_exn
!
example_bin_format
in
let
()
=
check
"return_register"
(
is_parameter_register
register
project
)
in
match
cconv
with
let
register
=
Var
.
create
"RAX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
|
"cdecl"
|
"stdcall"
|
"ms"
->
begin
let
()
=
check
"no_return_register"
(
is_parameter_register
register
project
=
false
)
in
let
register
=
Var
.
create
"EBX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
register
=
Var
.
create
"R14"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
let
()
=
check
"no_return_register"
(
is_parameter_register
register
project
=
false
)
in
let
register
=
Var
.
create
"EAX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
"fastcall"
->
begin
let
register
=
Var
.
create
"EDX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"ECX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
()
end
|
""
->
begin
match
arch
with
|
"x86_64"
->
begin
match
bin_format
with
|
"pe"
->
begin
let
register
=
Var
.
create
"R8"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"RDI"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
()
end
|
"elf"
->
begin
let
register
=
Var
.
create
"RDI"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"RBP"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
_
->
failwith
"Not a valid binary format"
end
|
"mips"
|
"mipsel"
|
"mips64"
|
"mips64el"
->
begin
let
register
=
Var
.
create
"A3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"V0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
"aarch64"
->
begin
let
register
=
Var
.
create
"X2"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"X23"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
"armv4"
|
"armv5"
|
"armv6"
|
"armv7"
|
"armv4eb"
|
"armv5eb"
|
"armv6eb"
|
"armv7eb"
|
"thumbv4"
|
"thumbv5"
|
"thumbv6"
|
"thumbv7"
|
"thumbv4eb"
|
"thumbv5eb"
|
"thumbv6eb"
|
"thumbv7eb"
->
begin
let
register
=
Var
.
create
"R3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"LR"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
"powerpc"
->
begin
let
register
=
Var
.
create
"R3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"F1"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
"powerpc64"
|
"powerpc64le"
->
begin
let
register
=
Var
.
create
"R3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
)
in
let
register
=
Var
.
create
"R31"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"parameter_register"
(
is_parameter_register
register
project
=
false
)
in
()
end
|
_
->
failwith
"Not a supported architecture"
end
|
_
->
failwith
"Not a supported calling convention"
let
test_return_register
()
=
let
test_return_register
()
=
(* this test assumes, that the example project is a x64 binary *)
(* this test assumes, that the example project is a x64 binary *)
let
project
=
Option
.
value_exn
!
example_project
in
let
project
=
Option
.
value_exn
!
example_project
in
let
arch
=
Option
.
value_exn
!
example_arch
in
let
cconv
=
Option
.
value
!
example_cconv
~
default
:
""
in
let
bin_format
=
Option
.
value_exn
!
example_bin_format
in
match
cconv
with
|
"cdecl"
|
"fastcall"
|
"stdcall"
|
"ms"
->
begin
let
register
=
Var
.
create
"EDX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"EBP"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
""
->
begin
match
arch
with
|
"x86_64"
->
begin
match
bin_format
with
|
"pe"
->
begin
let
register
=
Var
.
create
"RAX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
register
=
Var
.
create
"RAX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"RDX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
"elf"
->
begin
let
register
=
Var
.
create
"RDX"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"R12"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
register
=
Var
.
create
"R12"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
()
end
|
_
->
failwith
"Not a valid binary format"
end
|
"mips"
|
"mipsel"
|
"mips64"
|
"mips64el"
->
begin
let
register
=
Var
.
create
"V0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"A0"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
"aarch64"
->
begin
let
register
=
Var
.
create
"X1"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"X30"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
"armv4"
|
"armv5"
|
"armv6"
|
"armv7"
|
"armv4eb"
|
"armv5eb"
|
"armv6eb"
|
"armv7eb"
|
"thumbv4"
|
"thumbv5"
|
"thumbv6"
|
"thumbv7"
|
"thumbv4eb"
|
"thumbv5eb"
|
"thumbv6eb"
|
"thumbv7eb"
->
begin
let
register
=
Var
.
create
"R3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"R4"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
"powerpc"
->
begin
let
register
=
Var
.
create
"R3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"R10"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
"powerpc64"
|
"powerpc64le"
->
begin
let
register
=
Var
.
create
"R3"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"return_register"
(
is_return_register
register
project
)
in
let
register
=
Var
.
create
"R25"
(
Bil
.
Imm
(
Symbol_utils
.
arch_pointer_size_in_bytes
project
*
8
))
in
let
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
end
|
_
->
failwith
"Not a supported architecture"
end
|
_
->
failwith
"Not a supported calling convention"
let
test_parse_dyn_syms
()
=
let
test_extract_bin_format
()
=
(* this test assumes, that the example project is the arrays_x64.out binary from the artificial samples. *)
let
project
=
Option
.
value_exn
!
example_project
in
let
project
=
Option
.
value_exn
!
example_project
in
let
()
=
check
"free_as_dyn_sym"
(
String
.
Set
.
mem
(
parse_dyn_syms
project
)
"free"
)
in
let
()
=
check
"bin_format"
(
extract_bin_format
project
=
(
Option
.
value_exn
!
example_bin_format
))
in
let
()
=
check
"__libc_start_main_as_dyn_sym"
(
String
.
Set
.
mem
(
parse_dyn_syms
project
)
"__libc_start_main"
)
in
let
()
=
check
"malloc_as_dyn_sym"
(
String
.
Set
.
mem
(
parse_dyn_syms
project
)
"malloc"
)
in
let
()
=
check
"realloc_not_a_dyn_sym"
(
false
=
String
.
Set
.
mem
(
parse_dyn_syms
project
)
"realloc"
)
in
()
()
let
tests
=
[
let
tests
=
[
"Callee saved register"
,
`Quick
,
test_callee_saved
;
"Callee saved register"
,
`Quick
,
test_callee_saved
;
"Parameter register"
,
`Quick
,
test_parameter_register
;
"Parameter register"
,
`Quick
,
test_parameter_register
;
"Return register"
,
`Quick
,
test_return_register
;
"Return register"
,
`Quick
,
test_return_register
;
"
Parse dynamic symbols"
,
`Quick
,
test_parse_dyn_syms
;
"
Extract bin format"
,
`Quick
,
test_extract_bin_format
;
]
]
test/unit/utils/cconv_test.mli
View file @
fd91fb5c
...
@@ -4,4 +4,10 @@ open Core_kernel
...
@@ -4,4 +4,10 @@ open Core_kernel
val
example_project
:
Project
.
t
option
ref
val
example_project
:
Project
.
t
option
ref
val
example_cconv
:
string
option
ref
val
example_arch
:
string
option
ref
val
example_bin_format
:
string
option
ref
val
tests
:
unit
Alcotest
.
test_case
list
val
tests
:
unit
Alcotest
.
test_case
list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment