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)