[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 08/45] tests: add more int/number ranges chec
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH v2 08/45] tests: add more int/number ranges checks |
Date: |
Tue, 06 Jun 2017 16:14:39 +0000 |
Hi
On Thu, Jun 1, 2017 at 6:10 PM Markus Armbruster <address@hidden> wrote:
> Marc-André Lureau <address@hidden> writes:
>
> > Suggested by Markus Armbruster:
> >
> > We should systematically cover the integers, in particular the
> > boundaries (because that's where bugs like to hide):
> >
> > * Integers in [-2^63,0) can be visited with visit_type_int() and
> > visit_type_number().
> >
> > * Integers in [0,2^63) can be visited with visit_type_int(),
> > visit_type_uint64() and visit_type_number().
> >
> > * Integers in [2^63,2^64) can be visited with visit_type_uint64() and
> > visit_type_number().
> >
> > * Integers outside [-2^63,2^53) can be visited with visit_type_number().
> >
> > In any case, visit_type_number() loses precision beyond 53 bits.
> >
> > Signed-off-by: Marc-André Lureau <address@hidden>
> > ---
> > tests/test-qobject-input-visitor.c | 38
> ++++++++++++++++++++++++++++++++++++--
> > 1 file changed, 36 insertions(+), 2 deletions(-)
> >
> > diff --git a/tests/test-qobject-input-visitor.c
> b/tests/test-qobject-input-visitor.c
> > index 83d663d11d..f2ed3161af 100644
> > --- a/tests/test-qobject-input-visitor.c
> > +++ b/tests/test-qobject-input-visitor.c
> > @@ -102,11 +102,11 @@ static Visitor
> *visitor_input_test_init_raw(TestInputVisitorData *data,
> > {
> > return visitor_input_test_init_internal(data, false, json_string,
> NULL);
> > }
> > -
>
> Whoops.
>
> > static void test_visitor_in_int(TestInputVisitorData *data,
> > const void *unused)
> > {
> > int64_t res = 0;
> > + double dbl;
> > int value = -42;
> > Visitor *v;
> >
> > @@ -114,6 +114,9 @@ static void test_visitor_in_int(TestInputVisitorData
> *data,
> >
> > visit_type_int(v, NULL, &res, &error_abort);
> > g_assert_cmpint(res, ==, value);
> > +
> > + visit_type_number(v, NULL, &dbl, &error_abort);
> > + g_assert_cmpfloat(dbl, ==, -42.0);
> > }
> >
> > static void test_visitor_in_uint(TestInputVisitorData *data,
> > @@ -121,6 +124,8 @@ static void
> test_visitor_in_uint(TestInputVisitorData *data,
> > {
> > Error *err = NULL;
> > uint64_t res = 0;
> > + int64_t i64;
> > + double dbl;
> > int value = 42;
> > Visitor *v;
> >
> > @@ -129,8 +134,13 @@ static void
> test_visitor_in_uint(TestInputVisitorData *data,
> > visit_type_uint64(v, NULL, &res, &error_abort);
> > g_assert_cmpuint(res, ==, (uint64_t)value);
> >
> > - /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */
> > + visit_type_int(v, NULL, &i64, &error_abort);
> > + g_assert_cmpint(i64, ==, value);
> >
> > + visit_type_number(v, NULL, &dbl, &error_abort);
> > + g_assert_cmpfloat(dbl, ==, value);
> > +
> > + /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */
> > v = visitor_input_test_init(data, "%d", -value);
> >
> > visit_type_uint64(v, NULL, &res, &error_abort);
> > @@ -142,6 +152,8 @@ static void
> test_visitor_in_uint(TestInputVisitorData *data,
> >
> > visit_type_uint64(v, NULL, &res, &err);
> > error_free_or_abort(&err);
> > +
> > + visit_type_number(v, NULL, &dbl, &error_abort);
> > }
> >
> > static void test_visitor_in_int_overflow(TestInputVisitorData *data,
> > @@ -260,6 +272,26 @@ static void
> test_visitor_in_number(TestInputVisitorData *data,
> > g_assert_cmpfloat(res, ==, value);
> > }
> >
> > +static void test_visitor_in_large_number(TestInputVisitorData *data,
> > + const void *unused)
> > +{
> > + Error *err = NULL;
> > + double res = 0;
> > + int64_t i64;
> > + uint64_t u64;
> > + Visitor *v;
> > +
> > + v = visitor_input_test_init(data, "-18446744073709551616"); /*
> -2^64 */
> > +
> > + visit_type_number(v, NULL, &res, &error_abort);
>
> Shouldn't we check res has the expected value?
>
>
Is the precision loss during conversion going to be the same on all archs?
--
Marc-André Lureau