Dynamic growable arrays for internal use
Commit Message
On 06/06/2017 05:30 PM, Stefan Liebler wrote:
> Hi Florian,
>
> I get the following warning / werror with gcc 4.8.5 on s390x:
> gcc tst-dynarray.c -O3 -c ... -o <build>/malloc/tst-dynarray.o
> In file included from tst-dynarray.c:50:0:
> tst-dynarray.c: In function ‘do_test’:
> ../support/check.h:51:8: error: ‘result.length’ may be used
> uninitialized in this function [-Werror=maybe-uninitialized]
> if (expr) \
> ^
> tst-dynarray.c:377:23: note: ‘result.length’ was declared here
> struct long_array result;
> ^
> In file included from tst-dynarray.c:50:0:
> ../support/check.h:51:8: error: ‘result.array’ may be used uninitialized
> in this function [-Werror=maybe-uninitialized]
> if (expr) \
> ^
> tst-dynarray.c:377:23: note: ‘result.array’ was declared here
> struct long_array result;
> ^
> cc1: all warnings being treated as errors
>
>
> Have you seen those warnings on other architectures, too?
I could reproduce it with -O3 on s390x. I have not tried it with other
architectures, but it is a generic problem with TEST_VERIFY_EXIT which
is not really related to the dynarray code. I propose the attached
patch to fix it.
Thanks,
Florian
Comments
On 06/07/2017 11:40 AM, Florian Weimer wrote:
> On 06/06/2017 05:30 PM, Stefan Liebler wrote:
>> Hi Florian,
>>
>> I get the following warning / werror with gcc 4.8.5 on s390x:
>> gcc tst-dynarray.c -O3 -c ... -o <build>/malloc/tst-dynarray.o
>> In file included from tst-dynarray.c:50:0:
>> tst-dynarray.c: In function ‘do_test’:
>> ../support/check.h:51:8: error: ‘result.length’ may be used
>> uninitialized in this function [-Werror=maybe-uninitialized]
>> if (expr) \
>> ^
>> tst-dynarray.c:377:23: note: ‘result.length’ was declared here
>> struct long_array result;
>> ^
>> In file included from tst-dynarray.c:50:0:
>> ../support/check.h:51:8: error: ‘result.array’ may be used uninitialized
>> in this function [-Werror=maybe-uninitialized]
>> if (expr) \
>> ^
>> tst-dynarray.c:377:23: note: ‘result.array’ was declared here
>> struct long_array result;
>> ^
>> cc1: all warnings being treated as errors
>>
>>
>> Have you seen those warnings on other architectures, too?
>
> I could reproduce it with -O3 on s390x. I have not tried it with other
> architectures, but it is a generic problem with TEST_VERIFY_EXIT which
> is not really related to the dynarray code. I propose the attached
> patch to fix it.
>
> Thanks,
> Florian
>
This solves the warning with gcc 4.8.5 on s390x.
Thanks.
Stefan
On 06/07/2017 04:41 PM, Stefan Liebler wrote:
> On 06/07/2017 11:40 AM, Florian Weimer wrote:
>> On 06/06/2017 05:30 PM, Stefan Liebler wrote:
>>> Hi Florian,
>>>
>>> I get the following warning / werror with gcc 4.8.5 on s390x:
>>> gcc tst-dynarray.c -O3 -c ... -o <build>/malloc/tst-dynarray.o
>>> In file included from tst-dynarray.c:50:0:
>>> tst-dynarray.c: In function ‘do_test’:
>>> ../support/check.h:51:8: error: ‘result.length’ may be used
>>> uninitialized in this function [-Werror=maybe-uninitialized]
>>> if (expr) \
>>> ^
>>> tst-dynarray.c:377:23: note: ‘result.length’ was declared here
>>> struct long_array result;
>>> ^
>>> In file included from tst-dynarray.c:50:0:
>>> ../support/check.h:51:8: error: ‘result.array’ may be used uninitialized
>>> in this function [-Werror=maybe-uninitialized]
>>> if (expr) \
>>> ^
>>> tst-dynarray.c:377:23: note: ‘result.array’ was declared here
>>> struct long_array result;
>>> ^
>>> cc1: all warnings being treated as errors
>>>
>>>
>>> Have you seen those warnings on other architectures, too?
>>
>> I could reproduce it with -O3 on s390x. I have not tried it with other
>> architectures, but it is a generic problem with TEST_VERIFY_EXIT which
>> is not really related to the dynarray code. I propose the attached
>> patch to fix it.
>>
>> Thanks,
>> Florian
>>
>
> This solves the warning with gcc 4.8.5 on s390x.
Okay, I'll check it in tomorrow unless there are objections/further
comments.
Thanks,
Florian
support: Expose TEST_VERIFY_EXIT behavior to GCC optimizers
Previously, the implementation would conditionally exit based on the
status argument, which GCC did not know about. This leads to
false uninitialized variable warnings when data is accessed after a
TEST_VERIFY_EXIT failure (from code which would never execute).
2017-06-07 Florian Weimer <fweimer@redhat.com>
Expose TEST_VERIFY_EXIT process termination to GCC optimizers.
* support/support_test_verify_impl.c
(support_test_verify_exit_impl): Split from
support_test_verify_impl.
* support/check.h (TEST_VERIFY): Drop status argument from
support_test_verify_impl call.
(TEST_VERIFY_EXIT): Call support_test_verify_exit_impl.
(support_test_verify_impl): Remove status argument.
(support_test_verify_exit_impl): Declare.
@@ -51,7 +51,7 @@ __BEGIN_DECLS
if (expr) \
; \
else \
- support_test_verify_impl (-1, __FILE__, __LINE__, #expr); \
+ support_test_verify_impl (__FILE__, __LINE__, #expr); \
})
/* Record a test failure and exit if EXPR evaluates to false. */
@@ -60,7 +60,8 @@ __BEGIN_DECLS
if (expr) \
; \
else \
- support_test_verify_impl (1, __FILE__, __LINE__, #expr); \
+ support_test_verify_exit_impl \
+ (1, __FILE__, __LINE__, #expr); \
})
int support_print_failure_impl (const char *file, int line,
@@ -70,8 +71,11 @@ void support_exit_failure_impl (int exit_status,
const char *file, int line,
const char *format, ...)
__attribute__ ((noreturn, nonnull (2), format (printf, 4, 5)));
-void support_test_verify_impl (int status, const char *file, int line,
+void support_test_verify_impl (const char *file, int line,
const char *expr);
+void support_test_verify_exit_impl (int status, const char *file, int line,
+ const char *expr)
+ __attribute__ ((noreturn));
/* Record a test failure. This function returns and does not
terminate the process. The failure counter is stored in a shared
@@ -22,12 +22,16 @@
#include <stdlib.h>
void
-support_test_verify_impl (int status, const char *file, int line,
- const char *expr)
+support_test_verify_impl (const char *file, int line, const char *expr)
{
support_record_failure ();
printf ("error: %s:%d: not true: %s\n", file, line, expr);
- if (status >= 0)
- exit (status);
+}
+void
+support_test_verify_exit_impl (int status, const char *file, int line,
+ const char *expr)
+{
+ support_test_verify_impl (file, line, expr);
+ exit (status);
}