TranslationUnit[0:0->144:0] VariableDeclaration[0:0->2:0] NamedType[0:0->0:9] [static] int g_pid UnaryExpression[0:19->0:20] - NumericLiteral[0:20->0:20] 1 FunctionDeclaration[2:0->10:0] [static] NamedType[2:7->2:10] void handle_sigint ( Parameter[2:26->2:28] NamedType[2:26->2:28] int ) FunctionDefinition[3:0->10:0] { IfStatement[4:4->5:14] Predicate: BinaryExpression[4:8->4:18] Name[4:8->4:12] g_pid == UnaryExpression[4:17->4:18] - NumericLiteral[4:18->4:18] 1 Then: ReturnStatement[5:8->5:14] IfStatement[7:4->10:0] Predicate: BinaryExpression[7:8->7:43] FunctionCall[7:8->7:39] Name[7:8->7:13] ptrace Name[7:15->7:23] PT_DETACH Name[7:26->7:30] g_pid NumericLiteral[7:33->7:33] 0 NumericLiteral[7:36->7:36] 0 == UnaryExpression[7:42->7:43] - NumericLiteral[7:43->7:43] 1 Then: BlockStatement[7:46->10:0] FunctionCall[8:8->8:24] Name[8:8->8:13] perror StringLiteral[8:15->8:22] "detach" } FunctionDeclaration[12:0->144:0] NamedType[12:0->12:2] int main ( Parameter[12:9->12:16] argc NamedType[12:9->12:11] int Parameter[12:19->12:29] argv Pointer[12:19->12:24] Pointer[12:19->12:24] NamedType[12:19->12:23] char ) FunctionDefinition[13:0->144:0] { IfStatement[14:4->19:4] Predicate: BinaryExpression[14:8->14:74] FunctionCall[14:8->14:72] Name[14:8->14:13] pledge StringLiteral[14:15->14:60] "stdio wpath cpath proc exec ptrace sigaction" NullPointerLiteral[14:63->14:69] < NumericLiteral[14:74->14:74] 0 Then: BlockStatement[14:77->19:4] FunctionCall[15:8->15:24] Name[15:8->15:13] perror StringLiteral[15:15->15:22] "pledge" ReturnStatement[16:8->16:16] NumericLiteral[16:15->16:15] 1 VariableDeclaration[19:4->19:34] NamedType[19:4->19:22] Vector<[const] char*> child_argv VariableDeclaration[21:4->21:41] Pointer[21:4->21:14] NamedType[21:4->21:14] [const] char output_filename NullPointerLiteral[21:34->21:40] VariableDeclaration[22:4->22:60] NamedType[22:4->22:7] auto trace_file FunctionCall[22:22->22:60] Name[22:22->22:57] Core::DeprecatedFile::standard_error VariableDeclaration[24:4->24:27] NamedType[24:4->24:19] Core::ArgsParser parser FunctionCall[25:4->26:47] MemberExpression[25:4->25:27] Name[25:4->25:9] parser Identifier[25:11->25:26] set_general_help StringLiteral[26:8->26:45] "Trace all syscalls and their result." FunctionCall[27:4->27:70] MemberExpression[27:4->27:21] Name[27:4->27:9] parser Identifier[27:11->27:20] add_option Name[27:22->27:26] g_pid StringLiteral[27:29->27:49] "Trace the given PID" StringLiteral[27:52->27:56] "pid" StringLiteral[27:59->27:61] 'p' StringLiteral[27:64->27:68] "pid" FunctionCall[28:4->28:94] MemberExpression[28:4->28:21] Name[28:4->28:9] parser Identifier[28:11->28:20] add_option Name[28:22->28:36] output_filename StringLiteral[28:39->28:67] "Filename to write output to" StringLiteral[28:70->28:77] "output" StringLiteral[28:80->28:82] 'o' StringLiteral[28:85->28:92] "output" FunctionCall[29:4->29:111] MemberExpression[29:4->29:34] Name[29:4->29:9] parser Identifier[29:11->29:33] add_positional_argument Name[29:35->29:44] child_argv StringLiteral[29:47->29:65] "Arguments to exec" StringLiteral[29:68->29:77] "argument" Name[29:80->29:109] Core::ArgsParser::Required::No FunctionCall[31:4->31:28] MemberExpression[31:4->31:16] Name[31:4->31:9] parser Identifier[31:11->31:15] parse Name[31:17->31:20] argc Name[31:23->31:26] argv IfStatement[33:4->42:4] Predicate: BinaryExpression[33:8->33:33] Name[33:8->33:22] output_filename != NullPointerLiteral[33:27->33:33] Then: BlockStatement[33:36->42:4] VariableDeclaration[34:8->34:97] NamedType[34:8->34:11] auto open_result FunctionCall[34:27->34:97] Name[34:27->34:52] Core::DeprecatedFile::open Name[34:54->34:68] output_filename Name[34:71->34:95] Core::OpenMode::WriteOnly IfStatement[35:8->39:8] Predicate: FunctionCall[35:12->35:34] MemberExpression[35:12->35:32] Name[35:12->35:22] open_result Identifier[35:24->35:31] is_error Then: BlockStatement[35:36->39:8] FunctionCall[36:12->36:80] Name[36:12->36:16] outln Name[36:18->36:23] stderr StringLiteral[36:26->36:57] "Failed to open output file: {}" FunctionCall[36:60->36:79] MemberExpression[36:60->36:77] Name[36:60->36:70] open_result Identifier[36:72->36:76] error ReturnStatement[37:12->37:20] NumericLiteral[37:19->37:19] 1 AssignmentExpression[39:8->39:40] Name[39:8->39:17] trace_file = FunctionCall[39:21->39:40] MemberExpression[39:21->39:38] Name[39:21->39:31] open_result Identifier[39:33->39:37] value IfStatement[42:4->47:4] Predicate: BinaryExpression[42:8->42:62] FunctionCall[42:8->42:60] Name[42:8->42:13] pledge StringLiteral[42:15->42:48] "stdio proc exec ptrace sigaction" NullPointerLiteral[42:51->42:57] < NumericLiteral[42:62->42:62] 0 Then: BlockStatement[42:65->47:4] FunctionCall[43:8->43:24] Name[43:8->43:13] perror StringLiteral[43:15->43:22] "pledge" ReturnStatement[44:8->44:16] NumericLiteral[44:15->44:15] 1 VariableDeclaration[47:4->47:14] NamedType[47:4->47:6] int status IfStatement[48:4->81:4] Predicate: BinaryExpression[48:8->48:18] Name[48:8->48:12] g_pid == UnaryExpression[48:17->48:18] - NumericLiteral[48:18->48:18] 1 Then: BlockStatement[48:21->81:4] IfStatement[49:8->54:8] Predicate: FunctionCall[49:12->49:33] MemberExpression[49:12->49:31] Name[49:12->49:21] child_argv Identifier[49:23->49:30] is_empty Then: BlockStatement[49:35->54:8] FunctionCall[50:12->50:78] Name[50:12->50:16] outln Name[50:18->50:23] stderr StringLiteral[50:26->50:76] "strace: Expected either a pid or some arguments\n" ReturnStatement[51:12->51:20] NumericLiteral[51:19->51:19] 1 FunctionCall[54:8->54:34] MemberExpression[54:8->54:25] Name[54:8->54:17] child_argv Identifier[54:19->54:24] append NullPointerLiteral[54:26->54:32] VariableDeclaration[55:8->55:24] NamedType[55:8->55:10] int pid FunctionCall[55:18->55:24] Name[55:18->55:21] fork IfStatement[56:8->61:8] Predicate: BinaryExpression[56:12->56:18] Name[56:12->56:14] pid < NumericLiteral[56:18->56:18] 0 Then: BlockStatement[56:21->61:8] FunctionCall[57:12->57:26] Name[57:12->57:17] perror StringLiteral[57:19->57:24] "fork" ReturnStatement[58:12->58:20] NumericLiteral[58:19->58:19] 1 IfStatement[61:8->74:8] Predicate: UnaryExpression[61:12->61:15] ! Name[61:13->61:15] pid Then: BlockStatement[61:18->74:8] IfStatement[62:12->66:12] Predicate: BinaryExpression[62:16->62:49] FunctionCall[62:16->62:45] Name[62:16->62:21] ptrace Name[62:23->62:33] PT_TRACE_ME NumericLiteral[62:36->62:36] 0 NumericLiteral[62:39->62:39] 0 NumericLiteral[62:42->62:42] 0 == UnaryExpression[62:48->62:49] - NumericLiteral[62:49->62:49] 1 Then: BlockStatement[62:52->66:12] FunctionCall[63:16->63:33] Name[63:16->63:21] perror StringLiteral[63:23->63:31] "traceme" ReturnStatement[64:16->64:24] NumericLiteral[64:23->64:23] 1 VariableDeclaration[66:12->66:86] NamedType[66:12->66:14] int rc FunctionCall[66:21->66:86] Name[66:21->66:26] execvp FunctionCall[66:28->66:46] MemberExpression[66:28->66:44] Name[66:28->66:37] child_argv Identifier[66:39->66:43] first CppCastExpression[66:48->66:85] const_cast < Pointer[66:59->66:64] Pointer[66:59->66:64] NamedType[66:59->66:63] char > FunctionCall[66:67->66:84] MemberExpression[66:67->66:82] Name[66:67->66:76] child_argv Identifier[66:78->66:81] data IfStatement[67:12->71:12] Predicate: BinaryExpression[67:16->67:21] Name[67:16->67:17] rc < NumericLiteral[67:21->67:21] 0 Then: BlockStatement[67:24->71:12] FunctionCall[68:16->68:32] Name[68:16->68:21] perror StringLiteral[68:23->68:30] "execvp" FunctionCall[69:16->69:23] Name[69:16->69:19] exit NumericLiteral[69:21->69:21] 1 FunctionCall[71:12->71:32] Name[71:12->71:29] VERIFY_NOT_REACHED AssignmentExpression[74:8->74:18] Name[74:8->74:12] g_pid = Name[74:16->74:18] pid IfStatement[75:8->79:4] Predicate: BinaryExpression[75:12->75:83] FunctionCall[75:12->75:54] Name[75:12->75:18] waitpid Name[75:20->75:22] pid UnaryExpression[75:25->75:31] & Name[75:26->75:31] status BinaryExpression[75:34->75:51] Name[75:34->75:41] WSTOPPED | Name[75:45->75:51] WEXITED != BinaryExpression[75:57->75:83] Name[75:57->75:59] pid || UnaryExpression[75:64->75:83] ! FunctionCall[75:65->75:83] Name[75:65->75:74] WIFSTOPPED Name[75:76->75:81] status Then: BlockStatement[75:85->79:4] FunctionCall[76:12->76:29] Name[76:12->76:17] perror StringLiteral[76:19->76:27] "waitpid" ReturnStatement[77:12->77:20] NumericLiteral[77:19->77:19] 1 VariableDeclaration[81:4->81:23] NamedType[81:4->81:19] sigaction sa FunctionCall[82:4->82:44] Name[82:4->82:9] memset UnaryExpression[82:11->82:13] & Name[82:12->82:13] sa NumericLiteral[82:16->82:16] 0 SizeofExpression[82:19->82:43] NamedType[82:26->82:41] sigaction AssignmentExpression[83:4->83:32] MemberExpression[83:4->83:18] Name[83:4->83:5] sa Identifier[83:7->83:16] sa_handler = Name[83:20->83:32] handle_sigint FunctionCall[84:4->84:35] Name[84:4->84:12] sigaction Name[84:14->84:19] SIGINT UnaryExpression[84:22->84:24] & Name[84:23->84:24] sa NullPointerLiteral[84:27->84:33] IfStatement[86:4->90:4] Predicate: BinaryExpression[86:8->86:43] FunctionCall[86:8->86:39] Name[86:8->86:13] ptrace Name[86:15->86:23] PT_ATTACH Name[86:26->86:30] g_pid NumericLiteral[86:33->86:33] 0 NumericLiteral[86:36->86:36] 0 == UnaryExpression[86:42->86:43] - NumericLiteral[86:43->86:43] 1 Then: BlockStatement[86:46->90:4] FunctionCall[87:8->87:24] Name[87:8->87:13] perror StringLiteral[87:15->87:22] "attach" ReturnStatement[88:8->88:16] NumericLiteral[88:15->88:15] 1 IfStatement[90:4->95:4] Predicate: BinaryExpression[90:8->90:83] FunctionCall[90:8->90:52] Name[90:8->90:14] waitpid Name[90:16->90:20] g_pid UnaryExpression[90:23->90:29] & Name[90:24->90:29] status BinaryExpression[90:32->90:49] Name[90:32->90:39] WSTOPPED | Name[90:43->90:49] WEXITED != BinaryExpression[90:55->90:83] Name[90:55->90:59] g_pid || UnaryExpression[90:64->90:83] ! FunctionCall[90:65->90:83] Name[90:65->90:74] WIFSTOPPED Name[90:76->90:81] status Then: BlockStatement[90:85->95:4] FunctionCall[91:8->91:25] Name[91:8->91:13] perror StringLiteral[91:15->91:23] "waitpid" ReturnStatement[92:8->92:16] NumericLiteral[92:15->92:15] 1 ForStatement[95:4->143:4] BlockStatement[95:13->143:4] IfStatement[96:8->100:8] Predicate: BinaryExpression[96:12->96:48] FunctionCall[96:12->96:44] Name[96:12->96:17] ptrace Name[96:19->96:28] PT_SYSCALL Name[96:31->96:35] g_pid NumericLiteral[96:38->96:38] 0 NumericLiteral[96:41->96:41] 0 == UnaryExpression[96:47->96:48] - NumericLiteral[96:48->96:48] 1 Then: BlockStatement[96:51->100:8] FunctionCall[97:12->97:29] Name[97:12->97:17] perror StringLiteral[97:19->97:27] "syscall" ReturnStatement[98:12->98:20] NumericLiteral[98:19->98:19] 1 IfStatement[100:8->104:8] Predicate: BinaryExpression[100:12->100:87] FunctionCall[100:12->100:56] Name[100:12->100:18] waitpid Name[100:20->100:24] g_pid UnaryExpression[100:27->100:33] & Name[100:28->100:33] status BinaryExpression[100:36->100:53] Name[100:36->100:43] WSTOPPED | Name[100:47->100:53] WEXITED != BinaryExpression[100:59->100:87] Name[100:59->100:63] g_pid || UnaryExpression[100:68->100:87] ! FunctionCall[100:69->100:87] Name[100:69->100:78] WIFSTOPPED Name[100:80->100:85] status Then: BlockStatement[100:89->104:8] FunctionCall[101:12->101:30] Name[101:12->101:17] perror StringLiteral[101:19->101:28] "wait_pid" ReturnStatement[102:12->102:20] NumericLiteral[102:19->102:19] 1 VariableDeclaration[104:8->104:33] NamedType[104:8->104:22] PtraceRegisters regs BracedInitList[104:31->104:33] IfStatement[105:8->109:8] Predicate: BinaryExpression[105:12->105:52] FunctionCall[105:12->105:48] Name[105:12->105:17] ptrace Name[105:19->105:28] PT_GETREGS Name[105:31->105:35] g_pid UnaryExpression[105:38->105:42] & Name[105:39->105:42] regs NumericLiteral[105:45->105:45] 0 == UnaryExpression[105:51->105:52] - NumericLiteral[105:52->105:52] 1 Then: BlockStatement[105:55->109:8] FunctionCall[106:12->106:29] Name[106:12->106:17] perror StringLiteral[106:19->106:27] "getregs" ReturnStatement[107:12->107:20] NumericLiteral[107:19->107:19] 1 VariableDeclaration[109:8->109:36] NamedType[109:8->109:10] u32 syscall_index MemberExpression[109:28->109:36] Name[109:28->109:31] regs Identifier[109:33->109:35] eax VariableDeclaration[110:8->110:27] NamedType[110:8->110:10] u32 arg1 MemberExpression[110:19->110:27] Name[110:19->110:22] regs Identifier[110:24->110:26] edx VariableDeclaration[111:8->111:27] NamedType[111:8->111:10] u32 arg2 MemberExpression[111:19->111:27] Name[111:19->111:22] regs Identifier[111:24->111:26] ecx VariableDeclaration[112:8->112:27] NamedType[112:8->112:10] u32 arg3 MemberExpression[112:19->112:27] Name[112:19->112:22] regs Identifier[112:24->112:26] ebx IfStatement[114:8->118:8] Predicate: BinaryExpression[114:12->114:48] FunctionCall[114:12->114:44] Name[114:12->114:17] ptrace Name[114:19->114:28] PT_SYSCALL Name[114:31->114:35] g_pid NumericLiteral[114:38->114:38] 0 NumericLiteral[114:41->114:41] 0 == UnaryExpression[114:47->114:48] - NumericLiteral[114:48->114:48] 1 Then: BlockStatement[114:51->118:8] FunctionCall[115:12->115:29] Name[115:12->115:17] perror StringLiteral[115:19->115:27] "syscall" ReturnStatement[116:12->116:20] NumericLiteral[116:19->116:19] 1 IfStatement[118:8->123:8] Predicate: BinaryExpression[118:12->118:87] FunctionCall[118:12->118:56] Name[118:12->118:18] waitpid Name[118:20->118:24] g_pid UnaryExpression[118:27->118:33] & Name[118:28->118:33] status BinaryExpression[118:36->118:53] Name[118:36->118:43] WSTOPPED | Name[118:47->118:53] WEXITED != BinaryExpression[118:59->118:87] Name[118:59->118:63] g_pid || UnaryExpression[118:68->118:87] ! FunctionCall[118:69->118:87] Name[118:69->118:78] WIFSTOPPED Name[118:80->118:85] status Then: BlockStatement[118:89->123:8] FunctionCall[119:12->119:30] Name[119:12->119:17] perror StringLiteral[119:19->119:28] "wait_pid" ReturnStatement[120:12->120:20] NumericLiteral[120:19->120:19] 1 IfStatement[123:8->128:8] Predicate: BinaryExpression[123:12->123:52] FunctionCall[123:12->123:48] Name[123:12->123:17] ptrace Name[123:19->123:28] PT_GETREGS Name[123:31->123:35] g_pid UnaryExpression[123:38->123:42] & Name[123:39->123:42] regs NumericLiteral[123:45->123:45] 0 == UnaryExpression[123:51->123:52] - NumericLiteral[123:52->123:52] 1 Then: BlockStatement[123:55->128:8] FunctionCall[124:12->124:29] Name[124:12->124:17] perror StringLiteral[124:19->124:27] "getregs" ReturnStatement[125:12->125:20] NumericLiteral[125:19->125:19] 1 VariableDeclaration[128:8->128:26] NamedType[128:8->128:10] u32 res MemberExpression[128:18->128:26] Name[128:18->128:21] regs Identifier[128:23->128:25] eax VariableDeclaration[130:8->135:16] NamedType[130:8->130:11] auto string FunctionCall[130:22->135:16] Name[130:22->130:38] String::formatted StringLiteral[130:40->130:77] "{}({:#08x}, {:#08x}, {:#08x})\t={}\n" FunctionCall[131:12->131:64] Name[131:12->131:29] Syscall::to_string CStyleCastExpression[131:31->131:63] NamedType[131:32->131:48] Syscall::Function Name[131:50->131:62] syscall_index Name[132:12->132:15] arg1 Name[133:12->133:15] arg2 Name[134:12->134:15] arg3 Name[135:12->135:14] res IfStatement[137:8->141:4] Predicate: UnaryExpression[137:12->137:38] ! BinaryExpression[137:13->137:38] Name[137:13->137:22] trace_file -> FunctionCall[137:25->137:38] Name[137:25->137:29] write Name[137:31->137:36] string Then: BlockStatement[137:40->141:4] FunctionCall[138:12->138:59] Name[138:12->138:17] warnln StringLiteral[138:19->138:29] "write: {}" BinaryExpression[138:32->138:58] Name[138:32->138:41] trace_file -> FunctionCall[138:44->138:58] Name[138:44->138:55] error_string ReturnStatement[139:12->139:20] NumericLiteral[139:19->139:19] 1 ReturnStatement[143:4->143:12] NumericLiteral[143:11->143:11] 0 }