[vala/0.54] codegen: Access of inline allocated array is guaranteed to be non null
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.54] codegen: Access of inline allocated array is guaranteed to be non null
- Date: Wed, 9 Feb 2022 13:02:37 +0000 (UTC)
commit 66eca5a3dea1348e40feb1b636452e5b2db15ce7
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Sun Jan 23 18:46:48 2022 +0100
codegen: Access of inline allocated array is guaranteed to be non null
and improve null check for container in slice expression
Found by -Werror=address with GCC 12
See https://gitlab.gnome.org/GNOME/vala/issues/1282
codegen/valaccodearraymodule.vala | 1 +
codegen/valaccodebasemodule.vala | 11 +++++++++--
tests/arrays/slice-fixed-length.c-expected | 14 +++++++-------
tests/basic-types/arrays.c-expected | 10 +++++-----
tests/posix/arrays.c-expected | 10 +++++-----
vala/valamemberaccess.vala | 3 +++
6 files changed, 30 insertions(+), 19 deletions(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index 632b26046..2b3021a5f 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -210,6 +210,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
var splicelen = new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, cstop, cstart);
set_cvalue (expr, cstartpointer);
+ ((GLibValue) expr.target_value).non_null = get_non_null (expr.container.target_value);
// Make sure no previous length values are preserved
set_array_length (expr, splicelen);
}
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 0fb50df34..7dc89eaae 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -4831,6 +4831,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
return store_temp_value (new GLibValue (type, ccall), node);
} else {
+ CCodeExpression ccallarg;
+ if (node is SliceExpression) {
+ ccallarg = cexpr;
+ cexpr = get_cvalue (((SliceExpression) node).container);
+ } else {
+ ccallarg = cexpr;
+ }
var cnotnull = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cexpr, new
CCodeConstant ("NULL"));
if (type is GenericType) {
// dup functions are optional for type parameters
@@ -4840,9 +4847,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
if (type is GenericType) {
// cast from gconstpointer to gpointer as GBoxedCopyFunc expects gpointer
- ccall.add_argument (new CCodeCastExpression (cexpr, get_ccode_name
(pointer_type)));
+ ccall.add_argument (new CCodeCastExpression (ccallarg, get_ccode_name
(pointer_type)));
} else {
- ccall.add_argument (cexpr);
+ ccall.add_argument (ccallarg);
}
if (type is ArrayType) {
diff --git a/tests/arrays/slice-fixed-length.c-expected b/tests/arrays/slice-fixed-length.c-expected
index be50c1cc2..0a6d31126 100644
--- a/tests/arrays/slice-fixed-length.c-expected
+++ b/tests/arrays/slice-fixed-length.c-expected
@@ -225,7 +225,7 @@ _vala_main (void)
gint _foo_size_;
const gchar* _tmp6_;
const gchar* _tmp7_;
- _tmp5_ = ((bar + 1) != NULL) ? _vala_array_dup1 (bar + 1, 3 - 1) : (bar + 1);
+ _tmp5_ = _vala_array_dup1 (bar + 1, 3 - 1);
_tmp5__length1 = 3 - 1;
foo = _tmp5_;
foo_length1 = _tmp5__length1;
@@ -262,7 +262,7 @@ _vala_main (void)
const gchar* _tmp11_;
const gchar* _tmp12_;
begin = 1;
- _tmp10_ = ((bar + begin) != NULL) ? _vala_array_dup2 (bar + begin, 3 - begin) : (bar + begin);
+ _tmp10_ = _vala_array_dup2 (bar + begin, 3 - begin);
_tmp10__length1 = 3 - begin;
foo = _tmp10_;
foo_length1 = _tmp10__length1;
@@ -282,7 +282,7 @@ _vala_main (void)
gint _foo_size_;
const gchar* _tmp14_;
const gchar* _tmp15_;
- _tmp13_ = ((bar + 1) != NULL) ? _vala_array_dup3 (bar + 1, 3 - 1) : (bar + 1);
+ _tmp13_ = _vala_array_dup3 (bar + 1, 3 - 1);
_tmp13__length1 = 3 - 1;
foo = _tmp13_;
foo_length1 = _tmp13__length1;
@@ -319,7 +319,7 @@ _vala_main (void)
const gchar* _tmp19_;
const gchar* _tmp20_;
end = 3;
- _tmp18_ = ((bar + 1) != NULL) ? _vala_array_dup4 (bar + 1, end - 1) : (bar + 1);
+ _tmp18_ = _vala_array_dup4 (bar + 1, end - 1);
_tmp18__length1 = end - 1;
foo = _tmp18_;
foo_length1 = _tmp18__length1;
@@ -347,7 +347,7 @@ _vala_main (void)
{
gchar** _tmp21_;
gint _tmp21__length1;
- _tmp21_ = ((bar + 1) != NULL) ? _vala_array_dup5 (bar + 1, 3 - 1) : (bar + 1);
+ _tmp21_ = _vala_array_dup5 (bar + 1, 3 - 1);
_tmp21__length1 = 3 - 1;
minim (_tmp21_, (gint) _tmp21__length1);
}
@@ -356,7 +356,7 @@ _vala_main (void)
gchar** _tmp22_;
gint _tmp22__length1;
begin = 1;
- _tmp22_ = ((bar + begin) != NULL) ? _vala_array_dup6 (bar + begin, 3 - begin) : (bar + begin);
+ _tmp22_ = _vala_array_dup6 (bar + begin, 3 - begin);
_tmp22__length1 = 3 - begin;
minim (_tmp22_, (gint) _tmp22__length1);
}
@@ -365,7 +365,7 @@ _vala_main (void)
gchar** _tmp23_;
gint _tmp23__length1;
end = 3;
- _tmp23_ = ((bar + 1) != NULL) ? _vala_array_dup7 (bar + 1, end - 1) : (bar + 1);
+ _tmp23_ = _vala_array_dup7 (bar + 1, end - 1);
_tmp23__length1 = end - 1;
minim (_tmp23_, (gint) _tmp23__length1);
}
diff --git a/tests/basic-types/arrays.c-expected b/tests/basic-types/arrays.c-expected
index ec9664488..363187e53 100644
--- a/tests/basic-types/arrays.c-expected
+++ b/tests/basic-types/arrays.c-expected
@@ -471,7 +471,7 @@ test_integer_array (void)
_vala_assert (_tmp22_ == 23, "b[1] == 23");
_tmp23_ = a;
_tmp23__length1 = a_length1;
- _tmp24_ = ((_tmp23_ + 1) != NULL) ? _vala_array_dup2 (_tmp23_ + 1, 3 - 1) : (_tmp23_ + 1);
+ _tmp24_ = (_tmp23_ != NULL) ? _vala_array_dup2 (_tmp23_ + 1, 3 - 1) : _tmp23_;
_tmp24__length1 = 3 - 1;
c = _tmp24_;
c_length1 = _tmp24__length1;
@@ -483,7 +483,7 @@ test_integer_array (void)
_vala_assert (_tmp26_ == 11, "c[1] == 11");
_tmp27_ = a;
_tmp27__length1 = a_length1;
- _tmp28_ = ((_tmp27_ + 0) != NULL) ? _vala_array_dup3 (_tmp27_ + 0, 0 - 0) : (_tmp27_ + 0);
+ _tmp28_ = (_tmp27_ != NULL) ? _vala_array_dup3 (_tmp27_ + 0, 0 - 0) : _tmp27_;
_tmp28__length1 = 0 - 0;
c0 = _tmp28_;
c0_length1 = _tmp28__length1;
@@ -494,7 +494,7 @@ test_integer_array (void)
_tmp29__length1 = a_length1;
_tmp30_ = a;
_tmp30__length1 = a_length1;
- _tmp31_ = ((_tmp30_ + 1) != NULL) ? _vala_array_dup4 (_tmp30_ + 1, _tmp30__length1 - 1) : (_tmp30_ +
1);
+ _tmp31_ = (_tmp30_ != NULL) ? _vala_array_dup4 (_tmp30_ + 1, _tmp30__length1 - 1) : _tmp30_;
_tmp31__length1 = _tmp30__length1 - 1;
c1 = _tmp31_;
c1_length1 = _tmp31__length1;
@@ -506,7 +506,7 @@ test_integer_array (void)
_vala_assert (_tmp33_ == 11, "c1[1] == 11");
_tmp34_ = a;
_tmp34__length1 = a_length1;
- _tmp35_ = ((_tmp34_ + 0) != NULL) ? _vala_array_dup5 (_tmp34_ + 0, 2 - 0) : (_tmp34_ + 0);
+ _tmp35_ = (_tmp34_ != NULL) ? _vala_array_dup5 (_tmp34_ + 0, 2 - 0) : _tmp34_;
_tmp35__length1 = 2 - 0;
c2 = _tmp35_;
c2_length1 = _tmp35__length1;
@@ -520,7 +520,7 @@ test_integer_array (void)
_tmp38__length1 = a_length1;
_tmp39_ = a;
_tmp39__length1 = a_length1;
- _tmp40_ = ((_tmp39_ + 0) != NULL) ? _vala_array_dup6 (_tmp39_ + 0, _tmp39__length1 - 0) : (_tmp39_ +
0);
+ _tmp40_ = (_tmp39_ != NULL) ? _vala_array_dup6 (_tmp39_ + 0, _tmp39__length1 - 0) : _tmp39_;
_tmp40__length1 = _tmp39__length1 - 0;
c3 = _tmp40_;
c3_length1 = _tmp40__length1;
diff --git a/tests/posix/arrays.c-expected b/tests/posix/arrays.c-expected
index 7b76fb9d8..4b5382a56 100644
--- a/tests/posix/arrays.c-expected
+++ b/tests/posix/arrays.c-expected
@@ -478,7 +478,7 @@ test_integer_array (void)
assert (_tmp22_ == 23);
_tmp23_ = a;
_tmp23__length1 = a_length1;
- _tmp24_ = ((_tmp23_ + 1) != NULL) ? _vala_array_dup2 (_tmp23_ + 1, 3 - 1) : (_tmp23_ + 1);
+ _tmp24_ = (_tmp23_ != NULL) ? _vala_array_dup2 (_tmp23_ + 1, 3 - 1) : _tmp23_;
_tmp24__length1 = 3 - 1;
c = _tmp24_;
c_length1 = _tmp24__length1;
@@ -490,7 +490,7 @@ test_integer_array (void)
assert (_tmp26_ == 11);
_tmp27_ = a;
_tmp27__length1 = a_length1;
- _tmp28_ = ((_tmp27_ + 0) != NULL) ? _vala_array_dup3 (_tmp27_ + 0, 0 - 0) : (_tmp27_ + 0);
+ _tmp28_ = (_tmp27_ != NULL) ? _vala_array_dup3 (_tmp27_ + 0, 0 - 0) : _tmp27_;
_tmp28__length1 = 0 - 0;
c0 = _tmp28_;
c0_length1 = _tmp28__length1;
@@ -501,7 +501,7 @@ test_integer_array (void)
_tmp29__length1 = a_length1;
_tmp30_ = a;
_tmp30__length1 = a_length1;
- _tmp31_ = ((_tmp30_ + 1) != NULL) ? _vala_array_dup4 (_tmp30_ + 1, _tmp30__length1 - 1) : (_tmp30_ +
1);
+ _tmp31_ = (_tmp30_ != NULL) ? _vala_array_dup4 (_tmp30_ + 1, _tmp30__length1 - 1) : _tmp30_;
_tmp31__length1 = _tmp30__length1 - 1;
c1 = _tmp31_;
c1_length1 = _tmp31__length1;
@@ -513,7 +513,7 @@ test_integer_array (void)
assert (_tmp33_ == 11);
_tmp34_ = a;
_tmp34__length1 = a_length1;
- _tmp35_ = ((_tmp34_ + 0) != NULL) ? _vala_array_dup5 (_tmp34_ + 0, 2 - 0) : (_tmp34_ + 0);
+ _tmp35_ = (_tmp34_ != NULL) ? _vala_array_dup5 (_tmp34_ + 0, 2 - 0) : _tmp34_;
_tmp35__length1 = 2 - 0;
c2 = _tmp35_;
c2_length1 = _tmp35__length1;
@@ -527,7 +527,7 @@ test_integer_array (void)
_tmp38__length1 = a_length1;
_tmp39_ = a;
_tmp39__length1 = a_length1;
- _tmp40_ = ((_tmp39_ + 0) != NULL) ? _vala_array_dup6 (_tmp39_ + 0, _tmp39__length1 - 0) : (_tmp39_ +
0);
+ _tmp40_ = (_tmp39_ != NULL) ? _vala_array_dup6 (_tmp39_ + 0, _tmp39__length1 - 0) : _tmp39_;
_tmp40__length1 = _tmp39__length1 - 0;
c3 = _tmp40_;
c3_length1 = _tmp40__length1;
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 27fda1d46..249219e6c 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -198,8 +198,11 @@ public class Vala.MemberAccess : Expression {
public override bool is_non_null () {
unowned Constant? c = symbol_reference as Constant;
+ unowned LocalVariable? l = symbol_reference as LocalVariable;
if (c != null) {
return (c is EnumValue || !c.type_reference.nullable);
+ } else if (l != null) {
+ return (l.variable_type is ArrayType && ((ArrayType)
l.variable_type).inline_allocated);
} else {
return false;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]