rizin/test/db/cmd/cmd_tc
Riccardo Schirone 1c78aee3cd
Convert i commands to rzshell (#1238)
* Start to create some RzBinObject specific API

Adding some unit tests

Fix for new relocs storage system

Fix test_bin unit test for oob-write

* Add `iA` command to newshell

Add `ie`/`iee` commands

Add support for `is`/`iE` commands

Add support for `ii` command

Add support for `il` command

Add support for `iM` command

Add support for `ir` command

Add support for `iS`/`iSS` commands

Add support for `iz` command

Add support for `i` command

Add support for `ic` command

Add support for `iC` command

Add support for `ih` and `iHH` commands

Add support for `iI` command

Add support for `iL` command

Fix descriptions of commands already converted

Add support for `idp` commands

Add support for `iD` command

Add support for `im` commands

Add support for `iR` command

Add support for `it` command

Add support for `iV` commands

Add support for `iw` command

Add support for `ix` commands

Add support for `iZ` command

Add support for `ik` command

Add support for `is.` command

Add support for `iS.` command

Reduce arguments in print_arch

Few Doxygen and ownership annotations

Add support for `iS=` command

Add support for `izz` and `izzz` commands

Add support for `ib` command

Add support for `ic*` command

Put section flags as the last field of the table

* Proper language detection.

* Rewritten blang.c

* implemented `icc/icm/icf <class name>`

* ignore blocks when printing langs

Remove num from `iA` output

* Fixed flags on java and added class column

Add support for `ia` commands

Fix `iCj` command

* RzBin: add rz_bin_object_sections_mapping_list API

* Fix rz-bin for new API

Remove unused va var in rz-bin.c

Fix `iA`/`-A` output

* implemented classdump_cpp

* Support namespaces

Use `icc`, `icl` does not exist anymore

Update output of broken tests for `icc`

Add `rz_return_*()` asserts in new `*_print()` functions

* Provide rz_core_bin_print API

* Select which parts to print also based on the mode

* Return bool from all `rz_core_bin_*_print()` API

* Use RzBinFile in new `rz_core_bin_*_print()` API

* Restore `dbg_dmi` test

* Remove oldshell handlers for `i` commands

* Remove `ieq` call in rizin, not needed

* Allow NULL `bf` in `rz_cmd_info_handler()`

* Re-add support for RZ_BIN_PREFIX for symbols/sections/segments/imports/relocs

* Move `ib` command to `obR`

* Show 'N/A' in `i` command when info are not available

* Assert on bf->o, just to be sure

* Make error messages clearer in `idp` commands

Co-authored-by: wargio <wargio@libero.it>
Co-authored-by: Giovanni <561184+wargio@users.noreply.github.com>
2021-09-04 22:37:05 +08:00

444 lines
No EOL
9.5 KiB
Text

NAME=tc
FILE=bins/mach0/objc-employee
ARGS=-b 64
CMDS=<<EOF
.ic*
ts Employee
ts NSString
EOF
EXPECT=<<EOF
pf *?w*?*?qpppp (objc_class)isa _shortWord (NSString)_username (NSString)_firstName _wideWord username firstName shortWord wideWord
pf pqzd p0 p1 str len
EOF
RUN
NAME=tc2
FILE=bins/mach0/objc-employee
BROKEN=1
CMDS=icc
EXPECT=<<EOF
@interface Employee : NSObject
{
s Employee::(ivar)_shortWord
@"NSString" Employee::(ivar)_username
@"NSString" Employee::(ivar)_firstName
Q Employee::(ivar)_wideWord
}
- (void) helloWorld
- (id) sayHello
- (unknown) p0
- (unknown) p1
- (unknown) p2
- (unknown) p3
- (unknown) base
- (id) username
- (void) setUsername:
- (id) firstName
- (void) setFirstName:
- (short) shortWord
- (unsigned long long) wideWord
+ (id) sayHello
@end
EOF
RUN
NAME=tc3
FILE=bins/mach0/objc-employee
CMDS=ic*
EXPECT=<<EOF
fs classes
"f class.public.Employee = 0x100001ae0"
"f super.public.Employee.NSObject = 0"
"f field.Employee.isa = 0x00000000"
"f field.Employee.Employee::_ivar__shortWord = 0x100003328"
"f field.Employee.Employee::_ivar__username = 0x100003330"
"f field.Employee.Employee::_ivar__firstName = 0x100003338"
"f field.Employee.Employee::_ivar__wideWord = 0x100003340"
"f field.Employee.Employee::_property_username = 0x00000000"
"f field.Employee.Employee::_property_firstName = 0x00000000"
"f field.Employee.Employee::_property_shortWord = 0x00000000"
"f field.Employee.Employee::_property_wideWord = 0x00000000"
"f method.Employee.helloWorld = 0x100001ae0"
"f method.Employee.sayHello = 0x100001b10"
"f method.Employee.p0 = 0x100001b40"
"f method.Employee.p1 = 0x100001b60"
"f method.Employee.p2 = 0x100001b80"
"f method.Employee.p3 = 0x100001ba0"
"f method.Employee.base = 0x100001bc0"
"f method.Employee.username = 0x100001c10"
"f method.Employee.setUsername: = 0x100001c40"
"f method.Employee.firstName = 0x100001c80"
"f method.Employee.setFirstName: = 0x100001cb0"
"f method.Employee.shortWord = 0x100001cf0"
"f method.Employee.wideWord = 0x100001d10"
"f method.class.Employee.sayHello = 0x100001be0"
td "struct Employee { struct objc_class * isa; short _shortWord; struct NSString* _username; struct NSString* _firstName; uint64_t _wideWord; void* username; void* firstName; void* shortWord; void* wideWord;};"
EOF
RUN
NAME=tc4
FILE=bins/mach0/objc-employee
CMDS=<<EOF
.ic*
tc "struct Employee"
tc "struct NSString"
EOF
EXPECT=<<EOF
struct Employee {
struct objc_class *isa;
short _shortWord;
struct NSString *_username;
struct NSString *_firstName;
uint64_t _wideWord;
void *username;
void *firstName;
void *shortWord;
void *wideWord;
};
struct NSString {
void *p0;
size_t p1;
char *str;
int len;
};
EOF
RUN
NAME=tc iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=<<EOF
.ic*
tsc Employee
tsc NSString
EOF
EXPECT=<<EOF
struct Employee {
struct objc_class *isa;
short _shortWord;
struct NSString *_username;
struct NSString *_firstName;
uint64_t _wideWord;
void *username;
void *firstName;
void *shortWord;
void *wideWord;
};
struct NSString {
void *p0;
size_t p1;
char *str;
int len;
};
EOF
RUN
NAME=tc2 iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=icc
BROKEN=1
EXPECT=<<EOF
@interface Employee : NSObject
{
s Employee::(ivar)_shortWord
@"NSString" Employee::(ivar)_username
@"NSString" Employee::(ivar)_firstName
Q Employee::(ivar)_wideWord
}
- (void) sayHello
- (void) helloWorld
- (unknown) p0
- (unknown) p1
- (unknown) p2
- (unknown) p3
- (unknown) base
- (id) username
- (void) setUsername:
- (id) firstName
- (void) setFirstName:
- (short) shortWord
- (unsigned long long) wideWord
- (void) .cxx_destruct
+ (void) sayHello
@end
EOF
RUN
NAME=tc3 iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=ic*
EXPECT=<<EOF
fs classes
"f class.public.Employee = 0x100007958"
"f super.public.Employee.NSObject = 0"
"f field.Employee.isa = 0x00000000"
"f field.Employee.Employee::_ivar__shortWord = 0x10000c228"
"f field.Employee.Employee::_ivar__username = 0x10000c22c"
"f field.Employee.Employee::_ivar__firstName = 0x10000c230"
"f field.Employee.Employee::_ivar__wideWord = 0x10000c234"
"f field.Employee.Employee::_property_username = 0x00000000"
"f field.Employee.Employee::_property_firstName = 0x00000000"
"f field.Employee.Employee::_property_shortWord = 0x00000000"
"f field.Employee.Employee::_property_wideWord = 0x00000000"
"f method.Employee.sayHello = 0x100007984"
"f method.Employee.helloWorld = 0x1000079b0"
"f method.Employee.p0 = 0x1000079dc"
"f method.Employee.p1 = 0x1000079f8"
"f method.Employee.p2 = 0x100007a14"
"f method.Employee.p3 = 0x100007a30"
"f method.Employee.base = 0x100007a4c"
"f method.Employee.username = 0x100007a64"
"f method.Employee.setUsername: = 0x100007a8c"
"f method.Employee.firstName = 0x100007ac4"
"f method.Employee.setFirstName: = 0x100007aec"
"f method.Employee.shortWord = 0x100007b24"
"f method.Employee.wideWord = 0x100007b44"
"f method.Employee..cxx_destruct = 0x100007b60"
"f method.class.Employee.sayHello = 0x100007958"
td "struct Employee { struct objc_class * isa; short _shortWord; struct NSString* _username; struct NSString* _firstName; uint64_t _wideWord; void* username; void* firstName; void* shortWord; void* wideWord;};"
EOF
RUN
NAME=tc4 iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=<<EOF
.ic*
tc "struct Employee"
tc "struct NSString"
EOF
EXPECT=<<EOF
struct Employee {
struct objc_class *isa;
short _shortWord;
struct NSString *_username;
struct NSString *_firstName;
uint64_t _wideWord;
void *username;
void *firstName;
void *shortWord;
void *wideWord;
};
struct NSString {
void *p0;
size_t p1;
char *str;
int len;
};
EOF
RUN
NAME=tc iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=<<EOF
.ic*
tsc Employee
tsc NSString
EOF
EXPECT=<<EOF
struct Employee {
struct objc_class *isa;
short _shortWord;
struct NSString *_username;
struct NSString *_firstName;
uint64_t _wideWord;
void *username;
void *firstName;
void *shortWord;
void *wideWord;
};
struct NSString {
void *p0;
size_t p1;
char *str;
int len;
};
EOF
RUN
NAME=tc2 iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=icc
BROKEN=1
EXPECT=<<EOF
@interface Employee
{
s Employee::(ivar)_shortWord
@"NSString" Employee::(ivar)_username
@"NSString" Employee::(ivar)_firstName
Q Employee::(ivar)_wideWord
}
- (void) sayHello
- (void) helloWorld
- (unknown) p0
- (unknown) p1
- (unknown) p2
- (unknown) p3
- (unknown) base
- (id) username
- (void) setUsername:
- (id) firstName
- (void) setFirstName:
- (short) shortWord
- (unsigned long long) wideWord
- (void) .cxx_destruct
+ (void) sayHello
@end
EOF
RUN
NAME=tc3 iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=ic*
EXPECT=<<EOF
fs classes
"f class.public.Employee = 0x1000079a8"
"f field.Employee.isa = 0x00000000"
"f field.Employee.Employee::_ivar__shortWord = 0x10000c1d8"
"f field.Employee.Employee::_ivar__username = 0x10000c1dc"
"f field.Employee.Employee::_ivar__firstName = 0x10000c1e0"
"f field.Employee.Employee::_ivar__wideWord = 0x10000c1e4"
"f field.Employee.Employee::_property_username = 0x00000000"
"f field.Employee.Employee::_property_firstName = 0x00000000"
"f field.Employee.Employee::_property_shortWord = 0x00000000"
"f field.Employee.Employee::_property_wideWord = 0x00000000"
"f method.Employee.sayHello = 0x1000079d8"
"f method.Employee.helloWorld = 0x100007a08"
"f method.Employee.p0 = 0x100007a38"
"f method.Employee.p1 = 0x100007a54"
"f method.Employee.p2 = 0x100007a70"
"f method.Employee.p3 = 0x100007a8c"
"f method.Employee.base = 0x100007aa8"
"f method.Employee.username = 0x100007ac0"
"f method.Employee.setUsername: = 0x100007ae8"
"f method.Employee.firstName = 0x100007b24"
"f method.Employee.setFirstName: = 0x100007b4c"
"f method.Employee.shortWord = 0x100007b88"
"f method.Employee.wideWord = 0x100007ba8"
"f method.Employee..cxx_destruct = 0x100007bc4"
"f method.class.Employee.sayHello = 0x1000079a8"
td "struct Employee { struct objc_class * isa; short _shortWord; struct NSString* _username; struct NSString* _firstName; uint64_t _wideWord; void* username; void* firstName; void* shortWord; void* wideWord;};"
EOF
RUN
NAME=tc4 iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=<<EOF
.ic*
tc "struct Employee"
tc "struct NSString"
EOF
EXPECT=<<EOF
struct Employee {
struct objc_class *isa;
short _shortWord;
struct NSString *_username;
struct NSString *_firstName;
uint64_t _wideWord;
void *username;
void *firstName;
void *shortWord;
void *wideWord;
};
struct NSString {
void *p0;
size_t p1;
char *str;
int len;
};
EOF
RUN
NAME=ttc typedef
FILE==
CMDS=<<EOF
td "typedef char *string;"
ttc string
EOF
EXPECT=<<EOF
typedef char * string;
EOF
RUN
NAME=ttj typedef
FILE==
CMDS=<<EOF
td "typedef char *string;"
ttj string
EOF
EXPECT=<<EOF
{"name":"string","type":"char *"}
EOF
RUN
NAME=test cmd tsc
FILE=bins/mach0/objc-employee
CMDS=<<EOF
.ic*
tsc Employee
EOF
EXPECT=<<EOF
struct Employee {
struct objc_class *isa;
short _shortWord;
struct NSString *_username;
struct NSString *_firstName;
uint64_t _wideWord;
void *username;
void *firstName;
void *shortWord;
void *wideWord;
};
EOF
RUN
NAME=test cmd tf
FILE=bins/mach0/objc-employee
CMDS=<<EOF
tf main
tf entry0
EOF
EXPECT=<<EOF
int main(int argc, char ** argv, char ** envp);
EOF
RUN
NAME=test cmd tec
FILE==
CMDS=<<EOF
td "enum foo {bar = 1, cow = 3};"
tec foo
EOF
EXPECT=<<EOF
enum foo {
bar = 1,
cow = 3
};
EOF
RUN
NAME=test cmd tuc
FILE==
CMDS=<<EOF
td "union Data {int i; int j;};"
tuc Data
EOF
EXPECT=<<EOF
union Data {
int i;
int j;
};
EOF
RUN
NAME=test cmd tsj
FILE==
CMDS=<<EOF
td "struct foo {};"
tsj foo
td "struct foo2 {int a; int b;};"
tsj foo2
EOF
EXPECT=<<EOF
{"name":"foo","members":{}}
{"name":"foo2","members":{"a":"int","b":"int"}}
EOF
RUN