diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-06-19 21:24:58 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-06-19 21:24:58 +0000 |
commit | 8259d36468b77548cec3e35406201d8fb384eafb (patch) | |
tree | 34cc2bd8b95185769b746c126f7bc3aaedf4bbf2 /gcc | |
parent | a09f1a766b297f1e248c86b3d2795c1501a506ef (diff) | |
download | gcc-8259d36468b77548cec3e35406201d8fb384eafb.zip gcc-8259d36468b77548cec3e35406201d8fb384eafb.tar.gz gcc-8259d36468b77548cec3e35406201d8fb384eafb.tar.bz2 |
compiler: reject incorrect unsafe.Offsetof expressions.
The x.Field argument to Offsetof may not involve hidden
dereferences of embedded pointer fields.
Also correct uninitialized implicit_ field.
From-SVN: r200221
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 20 | ||||
-rw-r--r-- | gcc/go/gofrontend/expressions.h | 2 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 9c1efb3..adadfbb 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -6955,6 +6955,26 @@ Builtin_call_expression::do_lower(Gogo* gogo, Named_object* function, return Expression::make_error(loc); } + if (this->code_ == BUILTIN_OFFSETOF) + { + Expression* arg = this->one_arg(); + Field_reference_expression* farg = arg->field_reference_expression(); + while (farg != NULL) + { + if (!farg->implicit()) + break; + // When the selector refers to an embedded field, + // it must not be reached through pointer indirections. + if (farg->expr()->deref() != farg->expr()) + { + this->report_error(_("argument of Offsetof implies indirection of an embedded field")); + return this; + } + // Go up until we reach the original base. + farg = farg->expr()->field_reference_expression(); + } + } + if (this->is_constant()) { Numeric_constant nc; diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h index ed3909c..3f4db91 100644 --- a/gcc/go/gofrontend/expressions.h +++ b/gcc/go/gofrontend/expressions.h @@ -1872,7 +1872,7 @@ class Field_reference_expression : public Expression Field_reference_expression(Expression* expr, unsigned int field_index, Location location) : Expression(EXPRESSION_FIELD_REFERENCE, location), - expr_(expr), field_index_(field_index), called_fieldtrack_(false) + expr_(expr), field_index_(field_index), implicit_(false), called_fieldtrack_(false) { } // Return the struct expression. |