diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-04-26 11:35:56 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-04-26 11:36:11 -0700 |
| commit | d1fa5692c685b804181d4658afce1e53ca74ec19 (patch) | |
| tree | 18d0c57776cdc470fa918e3e5fa18fdca80aa09d /src/analyze.cpp | |
| parent | 61e6c49bc537a1c8a8da1d8a0e777261eef74cef (diff) | |
| download | zig-d1fa5692c685b804181d4658afce1e53ca74ec19.tar.gz zig-d1fa5692c685b804181d4658afce1e53ca74ec19.zip | |
add array bounds checking in debug mode
closes #27
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 737fff0a7b..5be9e10392 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -993,6 +993,18 @@ static void resolve_function_proto(CodeGen *g, AstNode *node, FnTableEntry *fn_t add_node_error(g, directive_node, buf_sprintf("invalid function attribute: '%s'", buf_ptr(name))); } + } else if (buf_eql_str(name, "debug_safety")) { + if (fn_table_entry->is_extern) { + add_node_error(g, directive_node, + buf_sprintf("#debug_safety invalid on extern functions")); + } else { + bool enable; + bool ok = resolve_const_expr_bool(g, import, import->block_context, + &directive_node->data.directive.expr, &enable); + if (ok && !enable) { + fn_table_entry->safety_off = true; + } + } } else if (buf_eql_str(name, "condition")) { if (fn_proto->top_level_decl.visib_mod == VisibModExport) { bool include; @@ -2102,11 +2114,13 @@ BlockContext *new_block_context(AstNode *node, BlockContext *parent) { context->parent_loop_node = parent->parent_loop_node; context->c_import_buf = parent->c_import_buf; context->codegen_excluded = parent->codegen_excluded; + context->safety_off = parent->safety_off; } if (node && node->type == NodeTypeFnDef) { AstNode *fn_proto_node = node->data.fn_def.fn_proto; context->fn_entry = fn_proto_node->data.fn_proto.fn_table_entry; + context->safety_off = context->fn_entry->safety_off; } else if (parent) { context->fn_entry = parent->fn_entry; } |
