1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
use binaryninja::headless::Session;
use binaryninja::platform::Platform;
use binaryninja::types::{CoreTypeParser, Type, TypeParser, TypeParserError};
use binaryninjacore_sys::BNTypeParserErrorSeverity::ErrorSeverity;
const TEST_TYPES: &str = r#"
typedef int int32_t;
typedef unsigned int uint32_t;
typedef float float_t;
typedef double double_t;
typedef char char_t;
typedef unsigned char uchar_t;
typedef short short_t;
typedef unsigned short ushort_t;
typedef long long_t;
typedef unsigned long ulong_t;
typedef long long longlong_t;
typedef unsigned long long ulonglong_t;
typedef void* void_ptr_t;
typedef int (*function_type)(int arg1, float arg2);
// This should be 2 types
typedef struct {
int a;
float b;
} struct_type;
"#;
#[test]
fn test_string_to_type() {
let _session = Session::new().expect("Failed to initialize session");
let platform = Platform::by_name("windows-x86_64").expect("windows-x86_64 exists");
let plat_type_container = platform.type_container();
let parser = CoreTypeParser::default();
let parsed_type = parser
.parse_type_string("int32_t", &platform, &plat_type_container)
.expect("Parsed int32_t");
let test_type = Type::int(4, true);
assert_eq!(test_type, parsed_type.ty);
}
#[test]
fn test_string_to_types() {
let _session = Session::new().expect("Failed to initialize session");
let platform = Platform::by_name("windows-x86_64").expect("windows-x86_64 exists");
let plat_type_container = platform.type_container();
let parser = CoreTypeParser::default();
let parsed_type = parser
.parse_types_from_source(
TEST_TYPES,
"test_file.h",
&platform,
&plat_type_container,
&[],
&[],
"",
)
.expect("Parsed types");
assert_eq!(14, parsed_type.types.len());
}
#[test]
fn test_parse_error() {
let _session = Session::new().expect("Failed to initialize session");
let platform = Platform::by_name("windows-x86_64").expect("windows-x86_64 exists");
let plat_type_container = platform.type_container();
let parser = CoreTypeParser::default();
let parser_error = parser
.parse_type_string("AAAAA", &platform, &plat_type_container)
.expect_err("Parsing should fail!");
assert_eq!(
parser_error,
vec![TypeParserError {
severity: ErrorSeverity,
message: "a type specifier is required for all declarations".to_string(),
file_name: "string.hpp".to_string(),
line: 1,
column: 1
}]
);
}
|