diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-12-10 00:29:33 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-12-10 00:31:01 +0100 |
commit | 7a9da618ba96a30e8a09543cac030c4d44b829a7 (patch) | |
tree | 8291c9aabdf779611eec4e6b509cbf2662bd2d08 | |
parent | a00755aafac28395aeb8fb3b6eb9f3801574cc97 (diff) | |
download | sparse-7a9da618ba96a30e8a09543cac030c4d44b829a7.tar.gz |
move check_access() to late_warnings()
check_access() is called at each run of simplify_loads().
However, a bad access can belong to a dead branch and thus a
bad access warning can be issued for code that is not executed,
maybe specifically excluded.
So, move check_access() to late_warnings(), where all optimizations
have been done.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | linearize.c | 6 | ||||
-rw-r--r-- | memops.c | 3 | ||||
-rw-r--r-- | validation/bad-check-access0.c | 31 |
3 files changed, 37 insertions, 3 deletions
diff --git a/linearize.c b/linearize.c index 9fecb4b5..0250c6bb 100644 --- a/linearize.c +++ b/linearize.c @@ -2532,6 +2532,12 @@ static void late_warnings(struct entrypoint *ep) continue; if (insn->tainted) check_tainted_insn(insn); + switch (insn->opcode) { + case OP_LOAD: + // Check for illegal offsets. + check_access(insn); + break; + } } END_FOR_EACH_PTR(insn); } END_FOR_EACH_PTR(bb); } @@ -147,9 +147,6 @@ static void simplify_loads(struct basic_block *bb) struct pseudo_list *dominators; unsigned long generation; - /* Check for illegal offsets.. */ - check_access(insn); - if (insn->is_volatile) continue; diff --git a/validation/bad-check-access0.c b/validation/bad-check-access0.c new file mode 100644 index 00000000..3c4c023f --- /dev/null +++ b/validation/bad-check-access0.c @@ -0,0 +1,31 @@ +#define SIZE 2 +static int buf[SIZE]; + +static inline int swt(int i) +{ + switch (i) { + case 0 ... (SIZE-1): + return buf[i]; + default: + return 0; + } +} + +static int switch_ok(void) { return swt(1); } +static int switch_ko(void) { return swt(2); } + + +static inline int cbr(int i, int p) +{ + if (p) + return buf[i]; + else + return 0; +} + +static int branch_ok(int x) { return cbr(1, x != x); } +static int branch_ko(int x) { return cbr(2, x != x); } + +/* + * check-name: bad-check-access0 + */ |