Fixing clang flow warnings (#321) ##rizin

This commit is contained in:
Giovanni 2021-01-19 03:11:17 +01:00 committed by pancake
parent 2285024b88
commit 5ffe3e4240
7 changed files with 130 additions and 54 deletions

View File

@ -86,10 +86,6 @@ static int pyc_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *data, int len, RA
} else {
oparg = data[1] + extended_arg;
}
extended_arg = 0;
if (op_code == ops->extended_arg) {
extended_arg = is_python36? (oparg << 8): (oparg * 65536);
}
}
if (op_obj->type & HASJABS) {

View File

@ -420,6 +420,14 @@ const amd29k_instruction_t amd29k_instructions[N_AMD29K_INSTRUCTIONS] = {
{ CPU_ANY, "xor", R_ANAL_OP_TYPE_XOR, 0x95 , decode_ra_rb_rci , NULL },
};
static bool is_cpu(const char* cpu, const amd29k_instruction_t *in) {
return cpu[0] == in->cpu[0] &&
cpu[1] == in->cpu[1] &&
cpu[2] == in->cpu[2] &&
cpu[3] == in->cpu[3] &&
cpu[4] == in->cpu[4];
}
bool amd29k_instr_decode(const ut8* buffer, const ut32 buffer_size, amd29k_instr_t* instruction, const char* cpu) {
if (!buffer || buffer_size < 4 || !instruction || (cpu && strlen (cpu) < 5)) {
return false;
@ -441,12 +449,7 @@ bool amd29k_instr_decode(const ut8* buffer, const ut32 buffer_size, amd29k_instr
instruction->mnemonic = in->mnemonic;
instruction->op_type = in->op_type;
return true;
} else if (in->cpu[0] != '*' && in->cpu[3] == '0' && in->mask == buffer[0]) {
in->decode (instruction, buffer);
instruction->mnemonic = in->mnemonic;
instruction->op_type = in->op_type;
return true;
} else if (in->cpu[0] != '*' && in->cpu[3] == '5' && in->mask == buffer[0]) {
} else if (in->cpu[0] != '*' && in->mask == buffer[0] && is_cpu(cpu, in)) {
in->decode (instruction, buffer);
instruction->mnemonic = in->mnemonic;
instruction->op_type = in->op_type;

View File

@ -3312,7 +3312,6 @@ print_insn_aarch64 (bfd_vma pc,
if (get_sym_code_type (info, n, &type))
{
last_sym = n;
found = TRUE;
break;
}
}

View File

@ -1715,13 +1715,13 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
different from that of the source register size,
e.g. in strb/ldrb. */
size = aarch64_get_qualifier_esize (qualifier);
if (!value_in_range_p (opnd->addr.offset.imm, 0, 4095 * size))
if (!value_in_range_p (imm, 0, 4095 * size))
{
set_offset_out_of_range_error (mismatch_detail, idx,
0, 4095 * size);
return 0;
}
if (!value_aligned_p (opnd->addr.offset.imm, size))
if (!value_aligned_p (imm, size))
{
set_unaligned_error (mismatch_detail, idx, size);
return 0;

View File

@ -80,18 +80,18 @@ static int mips_r(ut8 *b, int op, int rs, int rt, int rd, int sa, int fun) {
//^this will keep the below mips_r fuctions working
// diff instructions use a diff arg order (add is rd, rs, rt - sll is rd, rt, sa - sllv is rd, rt, rs
//static int mips_r (ut8 *b, int op, int rd, int rs, int rt, int sa, int fun) {
if (rs == -1 || rt == -1) {
if (rs < 0 || rt < 0 || rd < 0 || sa < 0) {
return -1;
}
b[3] = ((op<<2)&0xfc) | ((rs>>3)&3); // 2
b[2] = (rs<<5) | (rt&0x1f); // 1
b[1] = ((rd<<3)&0xff) | (sa>>2); // 0
b[0] = (fun&0x3f) | ((sa&3)<<6);
b[3] = ((op << 2) & 0xfc) | ((rs >> 3) & 3); // 2
b[2] = (rs << 5) | (rt & 0x1f); // 1
b[1] = ((rd << 3) & 0xff) | (sa >> 2); // 0
b[0] = (fun & 0x3f) | ((sa & 3) << 6);
return 4;
}
static int mips_i(ut8 *b, int op, int rs, int rt, int imm, int is_branch) {
if (rs == -1 || rt == -1) {
if (rs < 0 || rt < 0) {
return -1;
}
if (is_branch) {
@ -102,18 +102,18 @@ static int mips_i(ut8 *b, int op, int rs, int rt, int imm, int is_branch) {
imm = 0;
}
}
b[3] = ((op<<2)&0xfc) | ((rs>>3)&3);
b[2] = (rs<<5) | (rt);
b[1] = (imm>>8) &0xff;
b[3] = ((op << 2) & 0xfc) | ((rs >> 3) & 3);
b[2] = (rs << 5) | (rt);
b[1] = (imm >> 8) & 0xff;
b[0] = imm & 0xff;
return 4;
}
static int mips_j(ut8 *b, int op, int addr) {
addr /= 4;
b[3] = ((op<<2)&0xfc) | ((addr>>24)&3);
b[2] = (addr>>16)&0xff;
b[1] = (addr>>8) &0xff;
b[3] = ((op << 2) & 0xfc) | ((addr >> 24) & 3);
b[2] = (addr >> 16) & 0xff;
b[1] = (addr >> 8) & 0xff;
b[0] = addr & 0xff;
return 4;
}
@ -145,14 +145,22 @@ static int getreg(const char *p) {
}
R_IPI int mips_assemble(const char *str, ut64 pc, ut8 *out) {
int i, hasp, is_branch;
char *s = strdup (str);
int i, hasp;
char w0[32], w1[32], w2[32], w3[32];
char *s = strdup (str);
if (!s) {
return -1;
}
r_str_replace_char (s, ',', ' ');
hasp = r_str_replace_char (s, '(', ' ');
r_str_replace_char (s, ')', ' ');
*out = 0;
*w0=*w1=*w2=*w3=0;
*w0 = 0;
*w1 = 0;
*w2 = 0;
*w3 = 0;
if (!strncmp (s, "jalr", 4) && !strchr (s, ',')) {
char opstr[32];
@ -161,6 +169,9 @@ R_IPI int mips_assemble(const char *str, ut64 pc, ut8 *out) {
snprintf (opstr, sizeof (opstr), "jalr ra ra %s", arg + 1);
free (s);
s = strdup (opstr);
if (!s) {
return -1;
}
}
}
@ -184,52 +195,113 @@ R_IPI int mips_assemble(const char *str, ut64 pc, ut8 *out) {
strcpy (w3, tmp);
}
switch (ops[i].type) {
case 'R': //reg order diff per instruction 'group' - ordered to number of likelyhood to call (add > mfhi)
case 'R': {
// reg order diff per instruction 'group' - ordered to number of likelyhood to call (add > mfhi)
int op = 0, rs = 0, rt = 0, rd = 0, sa = 0, fn = 0;
bool invalid = false;
switch (ops[i].args) {
case 3: return mips_r (out, 0, getreg (w2), getreg (w3), getreg (w1), 0, ops[i].n); break;
case 3:
rs = getreg (w2);
rt = getreg (w3);
rd = getreg (w1);
fn = ops[i].n;
break;
case -3:
if (ops[i].n > -1) {
return mips_r (out, 0, 0, getreg (w2), getreg (w1), getreg (w3), ops[i].n);
break;
rt = getreg (w2);
rd = getreg (w1);
sa = getreg (w3);
fn = ops[i].n;
} else {
return mips_r (out, 0, getreg (w3), getreg (w2), getreg (w1), 0, (-1 * ops[i].n));
break;
rs = getreg (w3);
rt = getreg (w2);
rd = getreg (w1);
fn = (-1 * ops[i].n);
}
case 2: return mips_r (out, 0, getreg (w1), getreg (w2), 0, 0, ops[i].n); break;
case 1: return mips_r (out, 0, getreg (w1), 0, 0, 0, ops[i].n);
case -2: return mips_r (out, 0, getreg (w2), 0, getreg (w1), 0, ops[i].n); break;
case -1: return mips_r (out, 0, 0, 0, getreg (w1), 0, ops[i].n);
case 0: return mips_r (out, 0, 0, 0, 0, 0, ops[i].n);
break;
case 2:
rs = getreg (w1);
rt = getreg (w2);
fn = ops[i].n;
break;
case 1:
rs = getreg (w1);
fn = ops[i].n;
break;
case -2:
rs = getreg (w2);
rd = getreg (w1);
fn = ops[i].n;
break;
case -1:
rd = getreg (w1);
fn = ops[i].n;
break;
case 0:
fn = ops[i].n;
break;
default:
invalid = true;
break;
}
if (!invalid) {
free (s);
return mips_r (out, op, rs, rt, rd, sa, fn);
}
break;
}
case 'I':
case 'B':
is_branch = ops[i].type == 'B';
case 'B': {
bool invalid = false;
int op = 0, rs = 0, rt = 0, imm = 0, is_branch = ops[i].type == 'B';
switch (ops[i].args) {
case 2: return mips_i (out, ops[i].n, 0, getreg (w1), getreg (w2), is_branch); break;
case 3: return mips_i (out, ops[i].n, getreg (w2), getreg (w1), getreg (w3), is_branch); break;
case 2:
op = ops[i].n;
rt = getreg (w1);
imm = getreg (w2);
break;
case 3:
op = ops[i].n;
rs = getreg (w2);
rt = getreg (w1);
imm = getreg (w3);
break;
case -2:
if (ops[i].n > 0) {
return mips_i (out, ops[i].n, getreg (w1), 0, getreg (w2), is_branch);
break;
op = ops[i].n;
rs = getreg (w1);
imm = getreg (w2);
} else {
return mips_i (out, (-1 * ops[i].n), getreg (w1), ops[i].x, getreg (w2), is_branch);
break;
op = (-1 * ops[i].n);
rs = getreg (w1);
rt = ops[i].x;
imm = getreg (w2);
}
break;
case -1:
if (ops[i].n > 0) {
return mips_i (out, ops[i].n, 0, 0, getreg (w1), is_branch);
break;
op = ops[i].n;
imm = getreg (w1);
} else {
return mips_i (out, (-1 * ops[i].n), 0, ops[i].x, getreg (w1), is_branch);
break;
op = (-1 * ops[i].n);
rt = ops[i].x;
imm = getreg (w1);
}
break;
default:
invalid = true;
break;
}
if (!invalid) {
free (s);
return mips_i (out, op, rs, rt, imm, is_branch);
}
break;
}
case 'J':
switch (ops[i].args) {
case 1: return mips_j (out, ops[i].n, getreg (w1)); break;
if (ops[i].args == 1) {
free (s);
return mips_j (out, ops[i].n, getreg (w1));
}
break;
case 'N': // nop

View File

@ -295,6 +295,10 @@ static char *gdb_to_r2_profile(const char *gdb) {
}
if ((ptr1 = strchr (ptr, '\n'))) {
*ptr1 = '\0';
} else {
eprintf ("Could not parse line: %s (missing \\n)\n", ptr);
r_strbuf_free (sb);
return false;
}
ret = sscanf (ptr, " %s %d %d %d %d %s %s", name, &number, &rel,
&offset, &size, type, groups);
@ -302,6 +306,7 @@ static char *gdb_to_r2_profile(const char *gdb) {
if (ret < 6) {
if (*ptr != '*') {
eprintf ("Could not parse line: %s\n", ptr);
r_strbuf_free (sb);
return false;
}
ptr = ptr1 + 1;

View File

@ -533,6 +533,7 @@ R_API RDiffChar *r_diffchar_new(const ut8 *a, const ut8 *b) {
free (align_table);
free (align_a);
free (align_b);
free (diffchar);
return NULL;
}