summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2018-05-19 10:52:43 -0500
committerDamien George <damien.p.george@gmail.com>2018-05-21 12:04:20 +1000
commitbc6c0b28bf830a75c817fb498b713779c92b731b (patch)
tree3b2131da1877af80b30c82bc9d0ab8b28e1b59f0
parentafd0701bf7a9dcb50c5ab46b0ae88b303fec6ed3 (diff)
py/emitbc: Avoid undefined behavior calling memset() with NULL 1st arg.
Calling memset(NULL, value, 0) is not standards compliant so we must add an explicit check that emit->label_offsets is indeed not NULL before calling memset (this pointer will be NULL on the first pass of the parse tree and it's more logical / safer to check this pointer rather than check that the pass is not the first one). Code sanitizers will warn if NULL is passed as the first value to memset, and compilers may optimise the code based on the knowledge that any pointer passed to memset is guaranteed not to be NULL.
-rw-r--r--py/emitbc.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/py/emitbc.c b/py/emitbc.c
index 32e833000..b1b61ba67 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -315,7 +315,7 @@ void mp_emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) {
emit->last_source_line = 1;
#ifndef NDEBUG
// With debugging enabled labels are checked for unique assignment
- if (pass < MP_PASS_EMIT) {
+ if (pass < MP_PASS_EMIT && emit->label_offsets != NULL) {
memset(emit->label_offsets, -1, emit->max_num_labels * sizeof(mp_uint_t));
}
#endif