How to use bpf_probe_read() to copy large length data in EBPF program? - ebpf
I am trying to dump the contents of the user space buffer in write() system call by running ebpf programs on tracepoint/syscalls/sys_enter_write.
I want to copy data with a maximum length of 1024, so I use BPF_MAP_TYPE_PERCPU_ARRAY to temporarily store the expected data structure, but when reading data through bpf_probe_read, I get an error from the verifier: load program: permission denied: 11: (63) *(u32 *) (r2 +0) = r1: R2 invalid mem access 'inv' (21 line(s) omitted).
kernel: 5.4.119
#include "vmlinux.h"
#include "common.h"
#include "bpf_tracing.h"
#include "bpf_helpers.h"
char __license[] SEC("license") = "Dual MIT/GPL";
struct {
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
__uint(max_entries, 1);
__type(key, __u32);
__type(value, struct syscall_write_event_t);
} write_buffer_heap SEC(".maps");
struct {
__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
} syscall_write_events SEC(".maps");
#define MAX_MSG_SIZE 1024
// This needs to match exactly with the Go version of the struct.
struct syscall_write_event_t {
struct attr_t {
int event_type;
int fd;
int bytes;
// Care needs to be taken as only msg_size bytes of msg are guaranteed
// to be valid.
int msg_size;
} attr;
char msg[MAX_MSG_SIZE];
};
struct sys_enter_read_write_ctx {
__u64 __unused_syscall_header;
__u32 __unused_syscall_nr;
__u64 fd;
const char * buf;
size_t count;
};
enum {
kEventTypeSyscallAddrEvent = 1,
kEventTypeSyscallWriteEvent = 2,
kEventTypeSyscallCloseEvent = 3,
};
SEC("tracepoint/syscalls/sys_enter_write")
int syscall__probe_write(struct sys_enter_read_write_ctx *ctx) {
int zero = 0;
struct syscall_write_event_t *event = bpf_map_lookup_elem(&write_buffer_heap, &zero);
if (!event) {
return 0;
}
__builtin_memset(&event, 0, sizeof(event));
event->attr.fd = ctx->fd;
event->attr.bytes = ctx->count;
// size_t buf_size = ctx->count < sizeof(event->msg) ? ctx->count : sizeof(event->msg);
// size_t buf_size = ctx->count < 0x400 ? ctx->count : 0x3ff;
size_t buf_size = ctx->count & 0x3ff;
// asm volatile("%[buf_size] &= 0xfff;\n" ::[buf_size] "+r"(buf_size) :);
bpf_probe_read(&event->msg, buf_size, ctx->buf);
event->attr.msg_size = buf_size;
event->attr.event_type = kEventTypeSyscallWriteEvent;
bpf_perf_event_output(ctx, &syscall_write_events, BPF_F_CURRENT_CPU, &event, sizeof(event->attr) + buf_size);
return 0;
}
llvm-objdump -d -S --no-show-raw-insn -l --symbolize-operands syscalls_bpfel_x86.o
sock_bpfel_x86.o: file format elf64-bpf
Disassembly of section tracepoint/syscalls/sys_enter_write:
0000000000000000 <syscall__probe_write>:
; syscall__probe_write():
0: r6 = r1
1: r1 = 0
2: *(u32 *)(r10 - 4) = r1
3: r2 = r10
; syscall_write_events():
4: r2 += -4
5: r1 = 0 ll
7: call 1
8: if r0 == 0 goto +10 <LBB0_2>
9: r1 = *(u64 *)(r6 + 16)
10: r2 = 4
11: *(u32 *)(r2 + 0) = r1
12: r2 = *(u64 *)(r6 + 32)
13: r1 = 8
14: *(u32 *)(r1 + 0) = r2
15: r3 = *(u64 *)(r6 + 24)
16: r2 &= 1023
17: r1 = 16
18: call 4
0000000000000098 <LBB0_2>:
; LBB0_2():
19: r0 = 0
20: exit
verifier log:
func#0 #0
0: R1=ctx(id=0,off=0,imm=0) R10=fp0
; int syscall__probe_write(struct sys_enter_read_write_ctx *ctx) {
0: (bf) r6 = r1
1: R1=ctx(id=0,off=0,imm=0) R6_w=ctx(id=0,off=0,imm=0) R10=fp0
1: (b7) r1 = 0
2: R1_w=inv0 R6_w=ctx(id=0,off=0,imm=0) R10=fp0
; int zero = 0;
2: (63) *(u32 *)(r10 -4) = r1
last_idx 2 first_idx 0
regs=2 stack=0 before 1: (b7) r1 = 0
3: R1_w=invP0 R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=0000????
3: (bf) r2 = r10
4: R1_w=invP0 R2_w=fp0 R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=0000????
;
4: (07) r2 += -4
5: R1_w=invP0 R2_w=fp-4 R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=0000????
; struct syscall_write_event_t *event = bpf_map_lookup_elem(&write_buffer_heap, &zero);
5: (18) r1 = 0xffff888802a72000
7: R1_w=map_ptr(id=0,off=0,ks=4,vs=1040,imm=0) R2_w=fp-4 R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=0000????
7: (85) call bpf_map_lookup_elem#1
8: R0_w=map_value_or_null(id=1,off=0,ks=4,vs=1040,imm=0) R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmm????
; if (!event) {
8: (15) if r0 == 0x0 goto pc+10
R0_w=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmm????
9: R0_w=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmm????
; event->attr.fd = ctx->fd;
9: (61) r1 = *(u32 *)(r6 +16)
10: R0_w=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmm????
10: (b7) r2 = 4
11: R0_w=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2_w=inv4 R6_w=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmm????
; event->attr.fd = ctx->fd;
11: (63) *(u32 *)(r2 +0) = r1
R2 invalid mem access 'inv'
I removed __builtin_memset, then i got invalid stack type R4 off=-24 access_size=1039
SEC("tracepoint/syscalls/sys_enter_write")
int syscall__probe_write(struct sys_enter_read_write_ctx *ctx) {
int zero;
size_t buf_size = ctx->count < 0x400 ? ctx->count : 0x3ff;
asm volatile("%[buf_size] &= 0xfff;\n" ::[buf_size] "+r"(buf_size):);
char *buf;
bpf_probe_read(&buf, sizeof(buf), &ctx->buf);
zero = 0;
struct syscall_write_event_t *event = bpf_map_lookup_elem(&write_buffer_heap, &zero);
if (!event) {
return 0;
}
event->attr.fd = ctx->fd;
event->attr.bytes = ctx->count;
event->attr.msg_size = buf_size;
event->attr.event_type = kEventTypeSyscallWriteEvent;
int size = bpf_probe_read_str(&event->msg, buf_size, buf);
bpf_perf_event_output(ctx, &syscall_write_events, BPF_F_CURRENT_CPU, &event, sizeof(struct syscall_write_event_t)-MAX_MSG_SIZE+size);
return 0;
}
verifier log:
func#0 #0
0: R1=ctx(id=0,off=0,imm=0) R10=fp0
; int syscall__probe_write(struct sys_enter_read_write_ctx *ctx) {
0: (bf) r6 = r1
1: R1=ctx(id=0,off=0,imm=0) R6_w=ctx(id=0,off=0,imm=0) R10=fp0
; size_t buf_size = ctx->count & 0x3ff;
1: (79) r7 = *(u64 *)(r6 +24)
2: R1=ctx(id=0,off=0,imm=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0
; bpf_probe_read(&buf, sizeof(buf), &ctx->buf);
2: (bf) r3 = r6
3: R1=ctx(id=0,off=0,imm=0) R3_w=ctx(id=0,off=0,imm=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0
3: (07) r3 += 16
4: R1=ctx(id=0,off=0,imm=0) R3_w=ctx(id=0,off=16,imm=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0
4: (bf) r1 = r10
5: R1_w=fp0 R3_w=ctx(id=0,off=16,imm=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0
;
5: (07) r1 += -16
6: R1_w=fp-16 R3_w=ctx(id=0,off=16,imm=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0
; bpf_probe_read(&buf, sizeof(buf), &ctx->buf);
6: (b7) r2 = 8
7: R1_w=fp-16 R2_w=inv8 R3_w=ctx(id=0,off=16,imm=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0
7: (85) call bpf_probe_read#4
last_idx 7 first_idx 0
regs=4 stack=0 before 6: (b7) r2 = 8
8: R0_w=inv(id=0) R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0 fp-16=mmmmmmmm
8: (b7) r1 = 0
9: R0_w=inv(id=0) R1_w=inv0 R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0 fp-16=mmmmmmmm
; zero = 0;
9: (63) *(u32 *)(r10 -4) = r1
last_idx 9 first_idx 0
regs=2 stack=0 before 8: (b7) r1 = 0
10: R0_w=inv(id=0) R1_w=invP0 R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0 fp-8=0000???? fp-16=mmmmmmmm
10: (bf) r2 = r10
11: R0_w=inv(id=0) R1_w=invP0 R2_w=fp0 R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0 fp-8=0000???? fp-16=mmmmmmmm
;
11: (07) r2 += -4
12: R0_w=inv(id=0) R1_w=invP0 R2_w=fp-4 R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0 fp-8=0000???? fp-16=mmmmmmmm
; struct syscall_write_event_t *event = bpf_map_lookup_elem(&write_buffer_heap, &zero);
12: (18) r1 = 0xffff88880710a200
14: R0_w=inv(id=0) R1_w=map_ptr(id=0,off=0,ks=4,vs=1040,imm=0) R2_w=fp-4 R6_w=ctx(id=0,off=0,imm=0) R7_w=inv(id=0) R10=fp0 fp-8=0000???? fp-16=mmmmmmmm
14: (85) call bpf_map_lookup_elem#1
15: R0=map_value_or_null(id=1,off=0,ks=4,vs=1040,imm=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm
; struct syscall_write_event_t *event = bpf_map_lookup_elem(&write_buffer_heap, &zero);
15: (7b) *(u64 *)(r10 -24) = r0
16: R0=map_value_or_null(id=1,off=0,ks=4,vs=1040,imm=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value_or_null
; if (!event) {
16: (15) if r0 == 0x0 goto pc+25
R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
17: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.fd = ctx->fd;
17: (61) r1 = *(u32 *)(r6 +12)
18: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.fd = ctx->fd;
18: (63) *(u32 *)(r0 +4) = r1
R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
19: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.bytes = ctx->count;
19: (79) r1 = *(u64 *)(r6 +24)
20: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.bytes = ctx->count;
20: (63) *(u32 *)(r0 +8) = r1
R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
21: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
21: (b7) r1 = 2
22: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.event_type = kEventTypeSyscallWriteEvent;
22: (63) *(u32 *)(r0 +0) = r1
R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
23: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.msg_size = buf_size;
23: (57) r7 &= 1023
24: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; event->attr.msg_size = buf_size;
24: (63) *(u32 *)(r0 +12) = r7
R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
25: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; int size = bpf_probe_read_str(&event->msg, buf_size, buf);
25: (79) r3 = *(u64 *)(r10 -16)
26: R0=map_value(id=0,off=0,ks=4,vs=1040,imm=0) R1_w=inv2 R3_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; int size = bpf_probe_read_str(&event->msg, buf_size, buf);
26: (07) r0 += 16
27: R0_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R1_w=inv2 R3_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
; int size = bpf_probe_read_str(&event->msg, buf_size, buf);
27: (bf) r1 = r0
28: R0_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R1_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R3_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
28: (bf) r2 = r7
29: R0_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R1_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R2_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R3_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
29: (85) call bpf_probe_read_str#45
R0_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R1_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R2_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R3_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
R0_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R1_w=map_value(id=0,off=16,ks=4,vs=1040,imm=0) R2_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R3_w=inv(id=0) R6=ctx(id=0,off=0,imm=0) R7_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24_w=map_value
last_idx 29 first_idx 15
regs=4 stack=0 before 28: (bf) r2 = r7
regs=80 stack=0 before 27: (bf) r1 = r0
regs=80 stack=0 before 26: (07) r0 += 16
regs=80 stack=0 before 25: (79) r3 = *(u64 *)(r10 -16)
regs=80 stack=0 before 24: (63) *(u32 *)(r0 +12) = r7
regs=80 stack=0 before 23: (57) r7 &= 1023
regs=80 stack=0 before 22: (63) *(u32 *)(r0 +0) = r1
regs=80 stack=0 before 21: (b7) r1 = 2
regs=80 stack=0 before 20: (63) *(u32 *)(r0 +8) = r1
regs=80 stack=0 before 19: (79) r1 = *(u64 *)(r6 +24)
regs=80 stack=0 before 18: (63) *(u32 *)(r0 +4) = r1
regs=80 stack=0 before 17: (61) r1 = *(u32 *)(r6 +12)
regs=80 stack=0 before 16: (15) if r0 == 0x0 goto pc+25
regs=80 stack=0 before 15: (7b) *(u64 *)(r10 -24) = r0
R0_rw=map_value_or_null(id=1,off=0,ks=4,vs=1040,imm=0) R6_rw=ctx(id=0,off=0,imm=0) R7_rw=invP(id=0) R10=fp0 fp-8=mmmm???? fp-16_r=mmmmmmmm
parent didn't have regs=80 stack=0 marks
last_idx 14 first_idx 0
regs=80 stack=0 before 14: (85) call bpf_map_lookup_elem#1
regs=80 stack=0 before 12: (18) r1 = 0xffff88880710a200
regs=80 stack=0 before 11: (07) r2 += -4
regs=80 stack=0 before 10: (bf) r2 = r10
regs=80 stack=0 before 9: (63) *(u32 *)(r10 -4) = r1
regs=80 stack=0 before 8: (b7) r1 = 0
regs=80 stack=0 before 7: (85) call bpf_probe_read#4
regs=80 stack=0 before 6: (b7) r2 = 8
regs=80 stack=0 before 5: (07) r1 += -16
regs=80 stack=0 before 4: (bf) r1 = r10
regs=80 stack=0 before 3: (07) r3 += 16
regs=80 stack=0 before 2: (bf) r3 = r6
regs=80 stack=0 before 1: (79) r7 = *(u64 *)(r6 +24)
30: R0=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
; bpf_perf_event_output(ctx, &syscall_write_events, BPF_F_CURRENT_CPU, &event, sizeof(struct syscall_write_event_t)-MAX_MSG_SIZE+size);
30: (67) r0 <<= 32
31: R0_w=inv(id=0,umax_value=4393751543808,var_off=(0x0; 0x3ff00000000)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
31: (c7) r0 s>>= 32
32: R0_w=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
; bpf_perf_event_output(ctx, &syscall_write_events, BPF_F_CURRENT_CPU, &event, sizeof(struct syscall_write_event_t)-MAX_MSG_SIZE+size);
32: (07) r0 += 16
33: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
33: (bf) r4 = r10
34: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R4_w=fp0 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
;
34: (07) r4 += -24
35: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R4_w=fp-24 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
; bpf_perf_event_output(ctx, &syscall_write_events, BPF_F_CURRENT_CPU, &event, sizeof(struct syscall_write_event_t)-MAX_MSG_SIZE+size);
35: (bf) r1 = r6
36: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R1_w=ctx(id=0,off=0,imm=0) R4_w=fp-24 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
36: (18) r2 = 0xffff888807109c00
38: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R1_w=ctx(id=0,off=0,imm=0) R2_w=map_ptr(id=0,off=0,ks=4,vs=4,imm=0) R4_w=fp-24 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
38: (18) r3 = 0xffffffff
40: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R1_w=ctx(id=0,off=0,imm=0) R2_w=map_ptr(id=0,off=0,ks=4,vs=4,imm=0) R3_w=inv4294967295 R4_w=fp-24 R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
40: (bf) r5 = r0
41: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R1_w=ctx(id=0,off=0,imm=0) R2_w=map_ptr(id=0,off=0,ks=4,vs=4,imm=0) R3_w=inv4294967295 R4_w=fp-24 R5_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
41: (85) call bpf_perf_event_output#25
invalid stack type R4 off=-24 access_size=1039
i'm really confused, hope someone can help out, Thanks!
TL;DR. You want to pass a pointer to bpf_perf_event_output, not a pointer to a pointer.
Verifier Error Explanation
41: R0_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R1_w=ctx(id=0,off=0,imm=0) R2_w=map_ptr(id=0,off=0,ks=4,vs=4,imm=0) R3_w=inv4294967295 R4_w=fp-24 R5_w=inv(id=0,umin_value=16,umax_value=1039,var_off=(0x0; 0x7ff)) R6=ctx(id=0,off=0,imm=0) R7=inv(id=0,umax_value=1023,var_off=(0x0; 0x3ff)) R10=fp0 fp-8=mmmm???? fp-16=mmmmmmmm fp-24=map_value
41: (85) call bpf_perf_event_output#25
invalid stack type R4 off=-24 access_size=1039
Here the verifier complains that the fourth argument to bpf_perf_event_output is pointing to the stack with an access size that is way beyond the actual stack size. The fourth argument is &event.
Root Cause
The fourth argument to bpf_perf_event_output should be a pointer to the data to post on the ring buffer. Hence, you want to pass event as the argument, not &event.
Related
Convert subnet mask to cidr notation (Scala)
Here's what I have so far: //converts IP to a decimal or decimal to IP (working) private def longToIPv4(ip:Long): String = (for(a<-3 to 0 by -1) yield ((ip>>(a*8))&0xff).toString).mkString(".") private def IPv4ToLong(ip: String): Long = ip.split("\\.").reverse.zipWithIndex.map(a => a._1.toInt * math.pow(256, a._2).toLong).sum //convert subnet to cidr (to do) if(ip.matches("""(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})""")){ val pattern = """(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})""".r val pattern(o1, o2, o3, o4, o5, o6, o7, o8) = ip } I'm able to parse the subnet into octets and convert IP to decimal and vice versa, now I just need to convert subnet to cidr notation.
According to your example in the comment, I assumed that the conversions is as elaborated here. I wouldn't do it with regex. You can try something like: def cidrToSubnet(cidr: Int): String = { require(cidr > 0, "CIDR is out of range! It must be between 1 (inclusive) to 32 (inclusive).") require(cidr < 33, "CIDR is out of range! It must be between 1 (inclusive) to 32 (inclusive).") val ipInInt = if (cidr == 32) (Int.MaxValue << 1) + 1 else Integer.MAX_VALUE << (32 - cidr) ipInInt .toBinaryString .grouped(8) .map(bitString => Integer.parseInt(bitString, 2)) .mkString(".") } def subnetToCidr(subnet: String): Int = { 32 - subnet.split('.') .map(Integer.parseInt) .reverse .zipWithIndex .map { case (value, index) => value << index * 8 } .sum .toBinaryString .count(_ == '0') } Then running: 1.to(32).foreach(i => { println(i + ": cidrToSubnet(i): " + cidrToSubnet(i) + " subnetToCidr(cidrToSubnet(i): " + subnetToCidr(cidrToSubnet(i))) }) outputs: 1: cidrToSubnet(i): 128.0.0.0 subnetToCidr(cidrToSubnet(i): 1 2: cidrToSubnet(i): 192.0.0.0 subnetToCidr(cidrToSubnet(i): 2 3: cidrToSubnet(i): 224.0.0.0 subnetToCidr(cidrToSubnet(i): 3 4: cidrToSubnet(i): 240.0.0.0 subnetToCidr(cidrToSubnet(i): 4 5: cidrToSubnet(i): 248.0.0.0 subnetToCidr(cidrToSubnet(i): 5 6: cidrToSubnet(i): 252.0.0.0 subnetToCidr(cidrToSubnet(i): 6 7: cidrToSubnet(i): 254.0.0.0 subnetToCidr(cidrToSubnet(i): 7 8: cidrToSubnet(i): 255.0.0.0 subnetToCidr(cidrToSubnet(i): 8 9: cidrToSubnet(i): 255.128.0.0 subnetToCidr(cidrToSubnet(i): 9 10: cidrToSubnet(i): 255.192.0.0 subnetToCidr(cidrToSubnet(i): 10 11: cidrToSubnet(i): 255.224.0.0 subnetToCidr(cidrToSubnet(i): 11 12: cidrToSubnet(i): 255.240.0.0 subnetToCidr(cidrToSubnet(i): 12 13: cidrToSubnet(i): 255.248.0.0 subnetToCidr(cidrToSubnet(i): 13 14: cidrToSubnet(i): 255.252.0.0 subnetToCidr(cidrToSubnet(i): 14 15: cidrToSubnet(i): 255.254.0.0 subnetToCidr(cidrToSubnet(i): 15 16: cidrToSubnet(i): 255.255.0.0 subnetToCidr(cidrToSubnet(i): 16 17: cidrToSubnet(i): 255.255.128.0 subnetToCidr(cidrToSubnet(i): 17 18: cidrToSubnet(i): 255.255.192.0 subnetToCidr(cidrToSubnet(i): 18 19: cidrToSubnet(i): 255.255.224.0 subnetToCidr(cidrToSubnet(i): 19 20: cidrToSubnet(i): 255.255.240.0 subnetToCidr(cidrToSubnet(i): 20 21: cidrToSubnet(i): 255.255.248.0 subnetToCidr(cidrToSubnet(i): 21 22: cidrToSubnet(i): 255.255.252.0 subnetToCidr(cidrToSubnet(i): 22 23: cidrToSubnet(i): 255.255.254.0 subnetToCidr(cidrToSubnet(i): 23 24: cidrToSubnet(i): 255.255.255.0 subnetToCidr(cidrToSubnet(i): 24 25: cidrToSubnet(i): 255.255.255.128 subnetToCidr(cidrToSubnet(i): 25 26: cidrToSubnet(i): 255.255.255.192 subnetToCidr(cidrToSubnet(i): 26 27: cidrToSubnet(i): 255.255.255.224 subnetToCidr(cidrToSubnet(i): 27 28: cidrToSubnet(i): 255.255.255.240 subnetToCidr(cidrToSubnet(i): 28 29: cidrToSubnet(i): 255.255.255.248 subnetToCidr(cidrToSubnet(i): 29 30: cidrToSubnet(i): 255.255.255.252 subnetToCidr(cidrToSubnet(i): 30 31: cidrToSubnet(i): 255.255.255.254 subnetToCidr(cidrToSubnet(i): 31 32: cidrToSubnet(i): 255.255.255.255 subnetToCidr(cidrToSubnet(i): 32 Code run at Scastie.
To me it looks like you want to convert something like 1.2.3.0/255.255.255.0 to 1.2.3.0/24 With the The IPAddress Java library, it is trivial because it parses address/mask notation and can print addresses in many formats, the default format being CIDR notation. Disclaimer: I am the project manager. import inet.ipaddr.IPAddressString def convert(arg: String) { val ipaddStr = new IPAddressString(arg) println(ipaddStr.getAddress) } convert("1.2.3.0/255.255.255.0") Output: 1.2.3.0/24
Thread 2: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
I am new to coding. Currently, working on changing the bundle identifier name of existing application. Code was running "Thread 2: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" at the end. Appreciate, if anyone can break this down for me. libsystem_c.dylib`__abort: 0x7fff5219bb8b <+0>: pushq %rbp 0x7fff5219bb8c <+1>: movq %rsp, %rbp 0x7fff5219bb8f <+4>: pushq %r15 0x7fff5219bb91 <+6>: pushq %r14 0x7fff5219bb93 <+8>: pushq %r12 0x7fff5219bb95 <+10>: pushq %rbx 0x7fff5219bb96 <+11>: subq $0x20, %rsp 0x7fff5219bb9a <+15>: cmpq $0x0, 0x37c0e976(%rip) ; gCRAnnotations + 7 0x7fff5219bba2 <+23>: jne 0x7fff5219bbb2 ; <+39> 0x7fff5219bba4 <+25>: leaq 0x6741(%rip), %rax ; "__abort() called" 0x7fff5219bbab <+32>: movq %rax, 0x37c0e966(%rip) ; gCRAnnotations + 8 0x7fff5219bbb2 <+39>: leaq -0x30(%rbp), %r12 0x7fff5219bbb6 <+43>: andq $0x0, -0x8(%r12) 0x7fff5219bbbc <+49>: movl $0xffffffff, %eax ; imm = 0xFFFFFFFF 0x7fff5219bbc1 <+54>: movq %rax, (%r12) 0x7fff5219bbc5 <+58>: pushq $0x6 0x7fff5219bbc7 <+60>: popq %r15 0x7fff5219bbc9 <+62>: leaq -0x38(%rbp), %r14 0x7fff5219bbcd <+66>: movl %r15d, %edi 0x7fff5219bbd0 <+69>: movq %r14, %rsi 0x7fff5219bbd3 <+72>: xorl %edx, %edx 0x7fff5219bbd5 <+74>: callq 0x7fff521320ac ; sigaction 0x7fff5219bbda <+79>: andb $-0x21, 0x8(%r14) 0x7fff5219bbdf <+84>: leaq -0x24(%rbp), %rsi 0x7fff5219bbe3 <+88>: orl $-0x1, (%rsi) 0x7fff5219bbe6 <+91>: pushq $0x3 0x7fff5219bbe8 <+93>: popq %rbx 0x7fff5219bbe9 <+94>: movl %ebx, %edi 0x7fff5219bbeb <+96>: xorl %edx, %edx 0x7fff5219bbed <+98>: callq 0x7fff5219c832 ; symbol stub for: sigprocmask 0x7fff5219bbf2 <+103>: pushq $0x1 0x7fff5219bbf4 <+105>: popq %rdi 0x7fff5219bbf5 <+106>: callq 0x7fff5219c38e ; symbol stub for: __pthread_workqueue_setkill 0x7fff5219bbfa <+111>: movl %ebx, %edi 0x7fff5219bbfc <+113>: movq %r12, %rsi 0x7fff5219bbff <+116>: xorl %edx, %edx 0x7fff5219bc01 <+118>: callq 0x7fff5219c7ba ; symbol stub for: pthread_sigmask 0x7fff5219bc06 <+123>: callq 0x7fff5219c7ae ; symbol stub for: pthread_self 0x7fff5219bc0b <+128>: movq %rax, %rdi 0x7fff5219bc0e <+131>: movl %r15d, %esi 0x7fff5219bc11 <+134>: callq 0x7fff5219c76c ; symbol stub for: pthread_kill 0x7fff5219bc16 <+139>: movl $0x2710, %edi ; imm = 0x2710 0x7fff5219bc1b <+144>: callq 0x7fff5214d87c ; usleep$NOCANCEL 0x7fff5219bc20 <+149>: movl $0xffffffe7, 0x8(%r14) ; imm = 0xFFFFFFE7 0x7fff5219bc28 <+157>: movl %ebx, %edi 0x7fff5219bc2a <+159>: movq %r12, %rsi 0x7fff5219bc2d <+162>: xorl %edx, %edx 0x7fff5219bc2f <+164>: callq 0x7fff5219c832 ; symbol stub for: sigprocmask Stack trace: thread #7, stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) * frame #0: 0x00007fff5219bc34 libsystem_c.dylib`__abort + 169 frame #1: 0x00007fff5219bb8b libsystem_c.dylib`abort + 135 frame #2: 0x00007fff500a2858 libc++abi.dylib`abort_message + 231 frame #3: 0x00007fff50093cbf libc++abi.dylib`demangling_terminate_handler() + 262 frame #4: 0x00007fff51253c0b libobjc.A.dylib`_objc_terminate() + 96 frame #5: 0x00007fff500a1c87 libc++abi.dylib`std::__terminate(void (*)()) + 8 frame #6: 0x00007fff500a440b libc++abi.dylib`__cxxabiv1::failed_throw(__cxxabiv1::__cxa_exception*) + 27 frame #7: 0x00007fff500a43d2 libc++abi.dylib`__cxa_throw + 113 frame #8: 0x00007fff51253ad6 libobjc.A.dylib`objc_exception_throw + 340 frame #9: 0x00007fff25ac3079 Foundation`_AssertAutolayoutOnAllowedThreadsOnly + 428 frame #10: 0x00007fff25ac2c67 Foundation`-[NSISEngine _optimizeWithoutRebuilding] + 54 frame #11: 0x00007fff25ac2b9a Foundation`-[NSISEngine optimize] + 100 frame #12: 0x00007fff25abd8bc Foundation`-[NSISEngine performPendingChangeNotifications] + 82 frame #13: 0x00007fff4982da80 UIKitCore`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 3642 frame #14: 0x00007fff2b4e9260 QuartzCore`-[CALayer layoutSublayers] + 255 frame #15: 0x00007fff2b4ef3eb QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 523 frame #16: 0x00007fff2b4faa8a QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 80 frame #17: 0x00007fff2b443a7c QuartzCore`CA::Context::commit_transaction(CA::Transaction*, double) + 324 frame #18: 0x00007fff2b477467 QuartzCore`CA::Transaction::commit() + 649 frame #19: 0x00007fff2b478362 QuartzCore`CA::Transaction::release_thread(void*) + 210 frame #20: 0x00007fff522b5054 libsystem_pthread.dylib`_pthread_tsd_cleanup + 551 frame #21: 0x00007fff522b7512 libsystem_pthread.dylib`_pthread_exit + 70 frame #22: 0x00007fff522b4ddd libsystem_pthread.dylib`_pthread_wqthread_exit + 77 frame #23: 0x00007fff522b3afc libsystem_pthread.dylib`_pthread_wqthread + 481 frame #24: 0x00007fff522b2b77 libsystem_pthread.dylib`start_wqthread + 15
What is the difference between var testID = String() and var testID : String = "" [duplicate]
In other languages such as Java, under the hood there is actually a difference between string obtained via string literal vs initializer. In Swift, are they equivalent under the hood? e.g. var string:String = "" var string:String = String() Refer to this SO post for info on differences between literal and object in Java.
The declarations are equivalent according to the Apple docs: Initializing an Empty String To create an empty String value as the starting point for building a longer string, either assign an empty string literal to a variable, or initialize a new String instance with initializer syntax: var emptyString = "" // empty string literal var anotherEmptyString = String() // initializer syntax // these two strings are both empty, and are equivalent to each other Reference: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html If we look at the assembly, we will see that the two constructors use identical instructions. string.swift: let str = String() let str2 = "" Compiled assembly (swiftc -emit-assembly string.swift): .section __TEXT,__text,regular,pure_instructions .macosx_version_min 14, 3 .globl _main .align 4, 0x90 _main: .cfi_startproc pushq %rbp Ltmp0: .cfi_def_cfa_offset 16 Ltmp1: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp2: .cfi_def_cfa_register %rbp subq $16, %rsp movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token4#GOTPCREL(%rip), %rax movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func4#GOTPCREL(%rip), %rcx xorl %edx, %edx movl %edi, -4(%rbp) movq %rax, %rdi movq %rsi, -16(%rbp) movq %rcx, %rsi callq _swift_once movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token5#GOTPCREL(%rip), %rdi movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func5#GOTPCREL(%rip), %rax xorl %r8d, %r8d movl %r8d, %edx movq __TZvOSs7Process5_argcVSs5Int32#GOTPCREL(%rip), %rcx movl -4(%rbp), %r8d movl %r8d, (%rcx) movq %rax, %rsi callq _swift_once movq __TZvOSs7Process11_unsafeArgvGVSs20UnsafeMutablePointerGS0_VSs4Int8__#GOTPCREL(%rip), %rax movq -16(%rbp), %rcx movq %rcx, (%rax) callq __TFSSCfMSSFT_SS leaq L___unnamed_1(%rip), %rdi xorl %r8d, %r8d movl %r8d, %esi movl $1, %r8d movq %rax, __Tv6string3strSS(%rip) movq %rdx, __Tv6string3strSS+8(%rip) movq %rcx, __Tv6string3strSS+16(%rip) movl %r8d, %edx callq __TFSSCfMSSFT21_builtinStringLiteralBp8byteSizeBw7isASCIIBi1__SS xorl %r8d, %r8d movq %rax, __Tv6string4str2SS(%rip) movq %rdx, __Tv6string4str2SS+8(%rip) movq %rcx, __Tv6string4str2SS+16(%rip) movl %r8d, %eax addq $16, %rsp popq %rbp retq .cfi_endproc .globl __Tv6string3strSS .zerofill __DATA,__common,__Tv6string3strSS,24,3 .globl __Tv6string4str2SS .zerofill __DATA,__common,__Tv6string4str2SS,24,3 .section __TEXT,__cstring,cstring_literals L___unnamed_1: .space 1 .no_dead_strip __Tv6string3strSS .no_dead_strip __Tv6string4str2SS .linker_option "-lswiftCore" .section __DATA,__objc_imageinfo,regular,no_dead_strip L_OBJC_IMAGE_INFO: .long 0 .long 512 .subsections_via_symbols Notice that the declarations for str and str2 have identical instructions: xorl %r8d, %r8d movl %r8d, %esi movl $1, %r8d movq %rax, __Tv6string3strSS(%rip) movq %rdx, __Tv6string3strSS+8(%rip) movq %rcx, __Tv6string3strSS+16(%rip) movl %r8d, %edx # ... xorl %r8d, %r8d movq %rax, __Tv6string4str2SS(%rip) movq %rdx, __Tv6string4str2SS+8(%rip) movq %rcx, __Tv6string4str2SS+16(%rip) movl %r8d, %eax You can learn more about String literals by reviewing the Apple's documentation.
Setting environment variables of mkl
In order to set the environment variables of the mkl toolset on linux, I have to execute the script mklvars.sh. But now I get the errors /opt/intel/mkl/bin/mklvars.sh: 33: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 34: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 36: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 37: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 38: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 39: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 40: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 41: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 42: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 43: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 44: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 45: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 46: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 82: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 83: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 84: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 87: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 90: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 91: /opt/intel/mkl/bin/mklvars.sh: typeset: not found /opt/intel/mkl/bin/mklvars.sh: 92: /opt/intel/mkl/bin/mklvars.sh: typeset: not found The error lines start with typeset SCRIPT_NAME=$0 typeset MOD_NAME=mod typeset MKL_LP64_ILP64= typeset MKL_MOD= typeset MKL_TARGET_ARCH= typeset MKLVARS_VERBOSE= typeset MKL_MIC_ARCH= typeset MKL_BAD_SWITCH= typeset OLD_LD_LIBRARY_PATH= typeset OLD_LIBRARY_PATH= typeset OLD_MIC_LD_LIBRARY_PATH= typeset OLD_NLSPATH= How can I fix that, and what exactly is the problem?
Try this source /opt/intel/<address>/mklvars.sh For example, I remember I did, source /opt/intel/mkl/bin/mklvars.sh intel64 You need to source the environment variables. This should solve your problem. Hope it works !
(SWIFT) (String,Any) is not convertible to String
I am making an application using swift to monitor my battery information however I get a (String,Any) id not convertible to String from this line of code binfo.stringValue = x.battery["DesignCapacity"] where binfo is a GUI Label. Here is the full code: import Cocoa func executeCommand(command: String, args: [String]) -> String { let task = NSTask() task.launchPath = command task.arguments = args let pipe = NSPipe() task.standardOutput = pipe task.launch() let data = pipe.fileHandleForReading.readDataToEndOfFile() let output: String = NSString(data: data, encoding: NSUTF8StringEncoding)! return output } extension Array { func combine(separator: String) -> String{ var str : String = "" for (idx, item) in enumerate(self) { str += "\(item)" if idx < self.count-1 { str += separator } } return str } } extension String{ func replace(x:String,y:String) -> String{ var z = self.stringByReplacingOccurrencesOfString(x, withString: y, options: NSStringCompareOptions.LiteralSearch, range: nil) return z } } extension String{ func split(delimiter:String) -> Array<String>{ return self.componentsSeparatedByString(delimiter) } } func get_key_and_value(string:String) -> Array<Any>{ var x = string.split(" = ") if x[1].toInt() != nil{ return [x[0],x[1].toInt()] } else if x[1] == "Yes"{ return [x[0],true] } else if x[1] == "No"{ return [x[0],false] } else { return [x[0],x[1]] } //return [return_val[0],return_val[1]] } class Battery{ var battery = Dictionary<String, Any>() init(){ refreshValues() } internal func refreshValues(){ let commandOutput:String = executeCommand("/usr/sbin/ioreg", ["-r","-w0","-cAppleSmartBattery"]) var commandOutList = commandOutput.split("\n") commandOutList.removeAtIndex(0) commandOutList.removeAtIndex(0) for _ in 1...5{ var lastRemoved = commandOutList.removeLast() if lastRemoved == "}"{ break } } //Got Needed Infomation Only let commandOutStr = commandOutList.combine("") let cmdOutStr = commandOutStr.replace("\"",y: "").replace(" ",y: "\n") var cmdOutSplit = cmdOutStr.split("\n") cmdOutSplit.removeAtIndex(0) //var x = get_key_and_value(cmdOutSplit[0]) //var key:String = x[0] as String //var value = x[1] as Any for x in cmdOutSplit{ var y = get_key_and_value(x) battery[(y[0] as String).replace(" ", y: "")] = y[1] as Any } } } class ViewController: NSViewController { #IBOutlet weak var binfo: NSTextField! override func viewDidLoad() { super.viewDidLoad() var x = Battery() println(x.battery["DesignCapacity"]) binfo.stringValue = x.battery["DesignCapacity"] // Do any additional setup after loading the view. } override var representedObject: AnyObject? { didSet { // Update the view, if already loaded. } } } However if I change binfo.stringValue = x.battery["DesignCapacity"] to binfo.stringValue = x.battery["DesignCapacity"] as String I get a "Swift dynamic cast failure" Error with a log of libswiftCore.dylib`swift_dynamicCast: 0x1001b52f0: pushq %rbp 0x1001b52f1: movq %rsp, %rbp 0x1001b52f4: pushq %r15 0x1001b52f6: pushq %r14 0x1001b52f8: pushq %r13 0x1001b52fa: pushq %r12 0x1001b52fc: pushq %rbx 0x1001b52fd: subq $0x58, %rsp 0x1001b5301: movq %rcx, %r13 0x1001b5304: movq %rdx, %rbx 0x1001b5307: movq %rsi, %rdx 0x1001b530a: movq %rdi, %r12 0x1001b530d: movl $0x80000000, %r14d 0x1001b5313: movq (%r13), %rcx 0x1001b5317: xorl %eax, %eax 0x1001b5319: cmpq $0x41, %rcx 0x1001b531d: cmovbeq %rcx, %rax 0x1001b5321: cmpq $0x3f, %rax 0x1001b5325: jg 0x1001b5388 ; swift_dynamicCast + 152 0x1001b5327: cmpq $0x11, %rax 0x1001b532b: ja 0x1001b55b0 ; swift_dynamicCast + 704 0x1001b5331: leaq 0x504(%rip), %rcx ; swift_dynamicCast + 1356 0x1001b5338: movslq (%rcx,%rax,4), %rax 0x1001b533c: addq %rcx, %rax 0x1001b533f: jmpq *%rax 0x1001b5341: movq (%rbx), %rcx 0x1001b5344: xorl %eax, %eax 0x1001b5346: cmpq $0x41, %rcx 0x1001b534a: cmovbeq %rcx, %rax 0x1001b534e: cmpq $0x3f, %rax 0x1001b5352: jg 0x1001b5542 ; swift_dynamicCast + 594 0x1001b5358: cmpq $0x11, %rax 0x1001b535c: ja 0x1001b55b0 ; swift_dynamicCast + 704 0x1001b5362: leaq 0x51b(%rip), %rcx ; swift_dynamicCast + 1428 0x1001b5369: movslq (%rcx,%rax,4), %rax 0x1001b536d: addq %rcx, %rax 0x1001b5370: jmpq *%rax 0x1001b5372: movq (%rdx), %rsi 0x1001b5375: movq %r12, %rdi 0x1001b5378: movq %r13, %rdx 0x1001b537b: movq %r8, %rcx 0x1001b537e: callq 0x1001b58d0 ; _dynamicCastUnknownClass(swift::OpaqueValue*, void*, swift::Metadata const*, swift::DynamicCastFlags) 0x1001b5383: jmp 0x1001b55a8 ; swift_dynamicCast + 696 0x1001b5388: addq $-0x40, %rax 0x1001b538c: cmpq $0x2, %rax 0x1001b5390: jae 0x1001b55b0 ; swift_dynamicCast + 704 0x1001b5396: cmpq %r13, %rbx 0x1001b5399: je 0x1001b53fa ; swift_dynamicCast + 266 0x1001b539b: cmpq $0xc, (%rbx) 0x1001b539f: jne 0x1001b5418 ; swift_dynamicCast + 296 0x1001b53a1: testq %rbx, %rbx 0x1001b53a4: je 0x1001b5418 ; swift_dynamicCast + 296 0x1001b53a6: movq %r12, %r15 0x1001b53a9: movq %r8, %r12 0x1001b53ac: testq 0x8(%rbx), %r14 0x1001b53b0: je 0x1001b543f ; swift_dynamicCast + 335 0x1001b53b6: movq 0x18(%rdx), %rbx 0x1001b53ba: movq -0x8(%rbx), %rax 0x1001b53be: movq %rdx, %rdi 0x1001b53c1: movq %rbx, %rsi 0x1001b53c4: movq %rdx, -0x58(%rbp) 0x1001b53c8: callq *0x10(%rax) 0x1001b53cb: movq %rax, %r14 0x1001b53ce: movq %r15, %rdi 0x1001b53d1: movq %r14, %rsi 0x1001b53d4: movq %rbx, %rdx 0x1001b53d7: movq %r13, %rcx 0x1001b53da: movq %r12, %rbx 0x1001b53dd: movq %rbx, %r8 0x1001b53e0: callq 0x1001b52f0 ; swift_dynamicCast 0x1001b53e5: movq -0x58(%rbp), %rdi 0x1001b53e9: movb %al, %r12b 0x1001b53ec: cmpq %rdi, %r14 0x1001b53ef: jne 0x1001b56b9 ; swift_dynamicCast + 969 0x1001b53f5: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b53fa: testb $0x2, %r8b 0x1001b53fe: movq -0x8(%r13), %rax 0x1001b5402: movq %r12, %rdi 0x1001b5405: movq %rdx, %rsi 0x1001b5408: movq %r13, %rdx 0x1001b540b: je 0x1001b5434 ; swift_dynamicCast + 324 0x1001b540d: callq *0x48(%rax) 0x1001b5410: movb $0x1, %r12b 0x1001b5413: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b5418: testb $0x1, %r8b 0x1001b541c: jne 0x1001b57ee ; swift_dynamicCast + 1278 0x1001b5422: testb $0x4, %r8b 0x1001b5426: jne 0x1001b555c ; swift_dynamicCast + 620 0x1001b542c: xorl %r12d, %r12d 0x1001b542f: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b5434: callq *0x30(%rax) 0x1001b5437: movb $0x1, %r12b 0x1001b543a: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b543f: movq (%rdx), %rdi 0x1001b5442: movq %rdx, %rbx 0x1001b5445: callq 0x1001deab0 ; swift_getObjectType 0x1001b544a: movq %r15, %rdi 0x1001b544d: movq %rbx, %rsi 0x1001b5450: movq %rax, %rdx 0x1001b5453: movq %r13, %rcx 0x1001b5456: movq %r12, %r8 0x1001b5459: callq 0x1001b52f0 ; swift_dynamicCast 0x1001b545e: jmp 0x1001b55a8 ; swift_dynamicCast + 696 0x1001b5463: movq (%rbx), %rcx 0x1001b5466: xorl %eax, %eax 0x1001b5468: cmpq $0x41, %rcx 0x1001b546c: cmovbeq %rcx, %rax 0x1001b5470: cmpq $0x10, %rax 0x1001b5474: ja 0x1001b5396 ; swift_dynamicCast + 166 0x1001b547a: movl $0x14001, %ecx 0x1001b547f: btq %rax, %rcx 0x1001b5483: jae 0x1001b5396 ; swift_dynamicCast + 166 0x1001b5489: leaq 0x44760(%rip), %rsi ; _TMpSs21_ObjectiveCBridgeable 0x1001b5490: movq %r13, %rdi 0x1001b5493: movq %r12, -0x58(%rbp) 0x1001b5497: movq %r8, %r12 0x1001b549a: movq %rdx, %r15 0x1001b549d: callq 0x1001b6b60 ; swift_conformsToProtocol 0x1001b54a2: movq %r15, %rdx 0x1001b54a5: movq %r12, %r8 0x1001b54a8: movq -0x58(%rbp), %r12 0x1001b54ac: testq %rax, %rax 0x1001b54af: je 0x1001b5396 ; swift_dynamicCast + 166 0x1001b54b5: movq %rdx, %r15 0x1001b54b8: movq %r8, -0x60(%rbp) 0x1001b54bc: movq %r13, %rdi 0x1001b54bf: movq %r13, %rsi 0x1001b54c2: movq %rax, %r14 0x1001b54c5: callq *0x8(%r14) 0x1001b54c9: testb %al, %al 0x1001b54cb: je 0x1001b55c7 ; swift_dynamicCast + 727 0x1001b54d1: movq %r13, %rdi 0x1001b54d4: movq %r13, %rsi 0x1001b54d7: callq *0x10(%r14) 0x1001b54db: movq %r14, -0x68(%rbp) 0x1001b54df: movq (%r15), %rsi 0x1001b54e2: movq $0x0, -0x30(%rbp) 0x1001b54ea: leaq -0x30(%rbp), %rdi 0x1001b54ee: movq %rax, %rdx 0x1001b54f1: movq -0x60(%rbp), %rbx 0x1001b54f5: movq %rbx, %rcx 0x1001b54f8: callq 0x1001b58d0 ; _dynamicCastUnknownClass(swift::OpaqueValue*, void*, swift::Metadata const*, swift::DynamicCastFlags) 0x1001b54fd: testb %al, %al 0x1001b54ff: je 0x1001b566b ; swift_dynamicCast + 891 0x1001b5505: movq %rbx, %rax 0x1001b5508: movq %rbx, %r14 0x1001b550b: andq $0x6, %rax 0x1001b550f: cmpq $0x6, %rax 0x1001b5513: movb $0x1, %al 0x1001b5515: je 0x1001b5522 ; swift_dynamicCast + 562 0x1001b5517: movq -0x30(%rbp), %rdi 0x1001b551b: callq 0x1001ddcd0 ; swift_unknownRetain 0x1001b5520: xorl %eax, %eax 0x1001b5522: movl %eax, -0x6c(%rbp) 0x1001b5525: movq -0x8(%r13), %rcx 0x1001b5529: xorl %eax, %eax 0x1001b552b: cmpq $0x19, 0x98(%rcx) 0x1001b5533: jae 0x1001b5726 ; swift_dynamicCast + 1078 0x1001b5539: leaq -0x50(%rbp), %r15 0x1001b553d: jmp 0x1001b5735 ; swift_dynamicCast + 1093 0x1001b5542: addq $-0x40, %rax 0x1001b5546: cmpq $0x2, %rax 0x1001b554a: jae 0x1001b55b0 ; swift_dynamicCast + 704 0x1001b554c: testb $0x1, %r8b 0x1001b5550: jne 0x1001b57fd ; swift_dynamicCast + 1293 0x1001b5556: testb $0x4, %r8b 0x1001b555a: je 0x1001b55bf ; swift_dynamicCast + 719 0x1001b555c: movq -0x8(%rbx), %rax 0x1001b5560: movq %rdx, %rdi 0x1001b5563: movq %rbx, %rsi 0x1001b5566: callq *0x20(%rax) 0x1001b5569: xorl %r12d, %r12d 0x1001b556c: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b5571: movq %r12, %rdi 0x1001b5574: movq %rdx, %rsi 0x1001b5577: movq %rbx, %rdx 0x1001b557a: movq %r13, %rcx 0x1001b557d: callq 0x1001b5b20 ; _dynamicCastToExistential(swift::OpaqueValue*, swift::OpaqueValue*, swift::Metadata const*, swift::ExistentialTypeMetadata const*, swift::DynamicCastFlags) 0x1001b5582: jmp 0x1001b55a8 ; swift_dynamicCast + 696 0x1001b5584: movq %r12, %rdi 0x1001b5587: movq %rdx, %rsi 0x1001b558a: movq %rbx, %rdx 0x1001b558d: movq %r13, %rcx 0x1001b5590: callq 0x1001b5ec0 ; _dynamicCastToMetatype(swift::OpaqueValue*, swift::OpaqueValue*, swift::Metadata const*, swift::MetatypeMetadata const*, swift::DynamicCastFlags) 0x1001b5595: jmp 0x1001b55a8 ; swift_dynamicCast + 696 0x1001b5597: movq %r12, %rdi 0x1001b559a: movq %rdx, %rsi 0x1001b559d: movq %rbx, %rdx 0x1001b55a0: movq %r13, %rcx 0x1001b55a3: callq 0x1001b6600 ; _dynamicCastToExistentialMetatype(swift::OpaqueValue*, swift::OpaqueValue*, swift::Metadata const*, swift::ExistentialMetatypeMetadata const*, swift::DynamicCastFlags) 0x1001b55a8: movb %al, %r12b 0x1001b55ab: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b55b0: leaq 0x363ad(%rip), %rax ; "Corrupt Swift type object" 0x1001b55b7: movq %rax, 0x5ae9a(%rip) ; gCRAnnotations + 8 0x1001b55be: int3 0x1001b55bf: xorl %r12d, %r12d 0x1001b55c2: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b55c7: movq -0x60(%rbp), %r14 0x1001b55cb: testb $0x1, %r14b 0x1001b55cf: jne 0x1001b580c ; swift_dynamicCast + 1308 0x1001b55d5: testb $0x4, %r14b 0x1001b55d9: movq %r15, %rdi 0x1001b55dc: jne 0x1001b571d ; swift_dynamicCast + 1069 0x1001b55e2: xorl %r12d, %r12d 0x1001b55e5: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b55ea: movq %rdx, -0x58(%rbp) 0x1001b55ee: movq %r8, %r14 0x1001b55f1: leaq 0x445f8(%rip), %rsi ; _TMpSs21_ObjectiveCBridgeable 0x1001b55f8: movq %rbx, %rdi 0x1001b55fb: callq 0x1001b6b60 ; swift_conformsToProtocol 0x1001b5600: testq %rax, %rax 0x1001b5603: je 0x1001b56ec ; swift_dynamicCast + 1020 0x1001b5609: movq %rbx, %rdi 0x1001b560c: movq %rbx, %rsi 0x1001b560f: movq %rax, %r15 0x1001b5612: callq *0x8(%r15) 0x1001b5616: movq %r15, %rcx 0x1001b5619: testb %al, %al 0x1001b561b: je 0x1001b5705 ; swift_dynamicCast + 1045 0x1001b5621: movq -0x58(%rbp), %r15 0x1001b5625: movq %r15, %rdi 0x1001b5628: movq %rbx, %rsi 0x1001b562b: callq *0x18(%rcx) 0x1001b562e: movq %r14, %rcx 0x1001b5631: orq $0x6, %rcx 0x1001b5635: movq %r12, %rdi 0x1001b5638: movq %rax, %rsi 0x1001b563b: movq %r13, %rdx 0x1001b563e: callq 0x1001b58d0 ; _dynamicCastUnknownClass(swift::OpaqueValue*, void*, swift::Metadata const*, swift::DynamicCastFlags) 0x1001b5643: movb %al, %r12b 0x1001b5646: testb %r12b, %r12b 0x1001b5649: sete %al 0x1001b564c: movzbl %al, %eax 0x1001b564f: imulq $0x2, %rax, %rax 0x1001b5653: addq $0x2, %rax 0x1001b5657: testq %r14, %rax 0x1001b565a: je 0x1001b56da ; swift_dynamicCast + 1002 0x1001b565c: movq -0x8(%rbx), %rax 0x1001b5660: movq %r15, %rdi 0x1001b5663: movq %rbx, %rsi 0x1001b5666: callq *0x20(%rax) 0x1001b5669: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b566b: xorl %r12d, %r12d 0x1001b566e: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b5670: movq %r12, %r15 0x1001b5673: movq %r8, %r12 0x1001b5676: testq 0x8(%rbx), %r14 0x1001b567a: je 0x1001b579a ; swift_dynamicCast + 1194 0x1001b5680: movq 0x18(%rdx), %rbx 0x1001b5684: movq -0x8(%rbx), %rax 0x1001b5688: movq %rdx, %rdi 0x1001b568b: movq %rbx, %rsi 0x1001b568e: movq %rdx, %r14 0x1001b5691: callq *0x10(%rax) 0x1001b5694: movq %r15, %rdi 0x1001b5697: movq %rax, %rsi 0x1001b569a: movq %rax, %r15 0x1001b569d: movq %rbx, %rdx 0x1001b56a0: movq %r13, %rcx 0x1001b56a3: movq %r12, %rbx 0x1001b56a6: movq %rbx, %r8 0x1001b56a9: callq 0x1001b52f0 ; swift_dynamicCast 0x1001b56ae: movq %r14, %rdi 0x1001b56b1: movb %al, %r12b 0x1001b56b4: cmpq %rdi, %r15 0x1001b56b7: je 0x1001b56da ; swift_dynamicCast + 1002 0x1001b56b9: testb %r12b, %r12b 0x1001b56bc: sete %al 0x1001b56bf: movzbl %al, %eax 0x1001b56c2: imulq $0x2, %rax, %rax 0x1001b56c6: addq $0x2, %rax 0x1001b56ca: testq %rbx, %rax 0x1001b56cd: je 0x1001b56da ; swift_dynamicCast + 1002 0x1001b56cf: movq 0x18(%rdi), %rsi 0x1001b56d3: movq -0x8(%rsi), %rax 0x1001b56d7: callq *0x18(%rax) 0x1001b56da: movb %r12b, %al 0x1001b56dd: addq $0x58, %rsp 0x1001b56e1: popq %rbx 0x1001b56e2: popq %r12 0x1001b56e4: popq %r13 0x1001b56e6: popq %r14 0x1001b56e8: popq %r15 0x1001b56ea: popq %rbp 0x1001b56eb: retq 0x1001b56ec: testb $0x1, %r14b 0x1001b56f0: movq -0x58(%rbp), %rdi 0x1001b56f4: jne 0x1001b581b ; swift_dynamicCast + 1323 0x1001b56fa: testb $0x4, %r14b 0x1001b56fe: jne 0x1001b571d ; swift_dynamicCast + 1069 0x1001b5700: xorl %r12d, %r12d 0x1001b5703: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b5705: testb $0x1, %r14b 0x1001b5709: jne 0x1001b582a ; swift_dynamicCast + 1338 0x1001b570f: testb $0x4, %r14b 0x1001b5713: movq -0x58(%rbp), %rdi 0x1001b5717: je 0x1001b57b0 ; swift_dynamicCast + 1216 0x1001b571d: movq -0x8(%rbx), %rax 0x1001b5721: jmp 0x1001b5563 ; swift_dynamicCast + 627 0x1001b5726: movq 0x88(%rcx), %rdi 0x1001b572d: callq 0x1001e177c ; symbol stub for: malloc 0x1001b5732: movq %rax, %r15 0x1001b5735: movq %rax, -0x78(%rbp) 0x1001b5739: xorl %edx, %edx 0x1001b573b: movl $0x1, %ecx 0x1001b5740: movq %r15, %rdi 0x1001b5743: movq %r13, %rsi 0x1001b5746: callq 0x1001df760 ; swift_storeEnumTagSinglePayload 0x1001b574b: testb $0x1, %r14b 0x1001b574f: je 0x1001b576a ; swift_dynamicCast + 1146 0x1001b5751: movq -0x30(%rbp), %rbx 0x1001b5755: movq %rbx, %rdi 0x1001b5758: movq %r15, %rsi 0x1001b575b: movq %r13, %rdx 0x1001b575e: movq %r13, %rcx 0x1001b5761: movq -0x68(%rbp), %rax 0x1001b5765: callq *0x20(%rax) 0x1001b5768: jmp 0x1001b5785 ; swift_dynamicCast + 1173 0x1001b576a: movq -0x30(%rbp), %rbx 0x1001b576e: movq %rbx, %rdi 0x1001b5771: movq %r15, %rsi 0x1001b5774: movq %r13, %rdx 0x1001b5777: movq %r13, %rcx 0x1001b577a: movq -0x68(%rbp), %rax 0x1001b577e: callq *0x28(%rax) 0x1001b5781: testb %al, %al 0x1001b5783: je 0x1001b57b8 ; swift_dynamicCast + 1224 0x1001b5785: movq -0x8(%r13), %rax 0x1001b5789: movq %r12, %rdi 0x1001b578c: movq %r15, %rsi 0x1001b578f: movq %r13, %rdx 0x1001b5792: callq *0x48(%rax) 0x1001b5795: movb $0x1, %r12b 0x1001b5798: jmp 0x1001b57bb ; swift_dynamicCast + 1227 0x1001b579a: movq (%rdx), %rsi 0x1001b579d: movq %r15, %rdi 0x1001b57a0: movq %r13, %rdx 0x1001b57a3: movq %r12, %rcx 0x1001b57a6: callq 0x1001b58d0 ; _dynamicCastUnknownClass(swift::OpaqueValue*, void*, swift::Metadata const*, swift::DynamicCastFlags) 0x1001b57ab: jmp 0x1001b55a8 ; swift_dynamicCast + 696 0x1001b57b0: xorl %r12d, %r12d 0x1001b57b3: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b57b8: xorl %r12d, %r12d 0x1001b57bb: movl -0x6c(%rbp), %eax 0x1001b57be: testb %al, %al 0x1001b57c0: jne 0x1001b57e0 ; swift_dynamicCast + 1264 0x1001b57c2: testb %r12b, %r12b 0x1001b57c5: sete %al 0x1001b57c8: movzbl %al, %eax 0x1001b57cb: imulq $0x2, %rax, %rax 0x1001b57cf: addq $0x2, %rax 0x1001b57d3: testq %r14, %rax 0x1001b57d6: je 0x1001b57e0 ; swift_dynamicCast + 1264 0x1001b57d8: movq %rbx, %rdi 0x1001b57db: callq 0x1001ddd20 ; swift_unknownRelease 0x1001b57e0: movq -0x78(%rbp), %rdi 0x1001b57e4: callq 0x1001e1752 ; symbol stub for: free 0x1001b57e9: jmp 0x1001b56da ; swift_dynamicCast + 1002 0x1001b57ee: leaq 0x36189(%rip), %rax ; "Swift dynamic cast failure" 0x1001b57f5: movq %rax, 0x5ac5c(%rip) ; gCRAnnotations + 8 0x1001b57fc: int3 0x1001b57fd: leaq 0x3617a(%rip), %rax ; "Swift dynamic cast failure" 0x1001b5804: movq %rax, 0x5ac4d(%rip) ; gCRAnnotations + 8 0x1001b580b: int3 0x1001b580c: leaq 0x3616b(%rip), %rax ; "Swift dynamic cast failure" 0x1001b5813: movq %rax, 0x5ac3e(%rip) ; gCRAnnotations + 8 0x1001b581a: int3 0x1001b581b: leaq 0x3615c(%rip), %rax ; "Swift dynamic cast failure" 0x1001b5822: movq %rax, 0x5ac2f(%rip) ; gCRAnnotations + 8 0x1001b5829: int3 0x1001b582a: leaq 0x3614d(%rip), %rax ; "Swift dynamic cast failure" 0x1001b5831: movq %rax, 0x5ac20(%rip) ; gCRAnnotations + 8 0x1001b5838: int3 0x1001b5839: nopl (%rax) 0x1001b583c: addl $0x27fffffb, %eax 0x1001b5841: cld If anyone can help that would be greatly appreciated!
Your code should run with a couple of changes; When adding the int value to the dictionary, you're adding an optional Int. Instead use the ! operator to add the actual Int; if x[1].toInt() != nil{ return [x[0],x[1].toInt()!] } else if x[1] == "Yes"{ Then (as you know it's an Int in the dictionary) you can just convert it to a string using the String constructor; binfo.stringValue = String(x.battery["DesignCapacity"] as Int)