diff mbox

Build broken

Message ID alpine.LNX.2.00.1108051019170.14809@linmac
State New
Headers show

Commit Message

malc Aug. 5, 2011, 6:22 a.m. UTC
/home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
/home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
/home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here


I guess gcc should yell not only here on ppc32 but on any machine where
pointer size is less than the size of two ints.

Comments

Kevin Wolf Aug. 5, 2011, 7:29 a.m. UTC | #1
Am 05.08.2011 08:22, schrieb malc:
> 
> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
> 
> diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
> index 41c2379..42dc3e2 100644
> --- a/coroutine-ucontext.c
> +++ b/coroutine-ucontext.c
> @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>      CoroutineUContext *co;
>      ucontext_t old_uc, uc;
>      jmp_buf old_env;
> -    union cc_arg arg;
> +    union cc_arg arg = {0};
>  
>      /* The ucontext functions preserve signal masks which incurs a system call
>       * overhead.  setjmp()/longjmp() does not preserve signal masks but only
> 
> I guess gcc should yell not only here on ppc32 but on any machine where
> pointer size is less than the size of two ints.

Stefan, why does this code even exist again? I think at some point I had
it changed to just use a static variable in order to avoid doing this
kind of tricks with unions.

Interestingly, the buildbot doesn't seem to have failed on i386.

Kevin
Stefan Hajnoczi Aug. 5, 2011, 8:48 a.m. UTC | #2
On Fri, Aug 5, 2011 at 8:29 AM, Kevin Wolf <kwolf@redhat.com> wrote:
> Am 05.08.2011 08:22, schrieb malc:
>>
>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
>>
>> diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
>> index 41c2379..42dc3e2 100644
>> --- a/coroutine-ucontext.c
>> +++ b/coroutine-ucontext.c
>> @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>>      CoroutineUContext *co;
>>      ucontext_t old_uc, uc;
>>      jmp_buf old_env;
>> -    union cc_arg arg;
>> +    union cc_arg arg = {0};
>>
>>      /* The ucontext functions preserve signal masks which incurs a system call
>>       * overhead.  setjmp()/longjmp() does not preserve signal masks but only
>>
>> I guess gcc should yell not only here on ppc32 but on any machine where
>> pointer size is less than the size of two ints.
>
> Stefan, why does this code even exist again? I think at some point I had
> it changed to just use a static variable in order to avoid doing this
> kind of tricks with unions.

virtfs are using coroutines in multiple threads at the same time.
Introducing a global variable wouldn't be thread-safe.

The real problem is that makecontext(3) has a bad function signature.
There's no nice fix - whatever we do will be ugly.

Using a union is the way it should be done in C.  The code doesn't
look pretty but it doesn't introduce global state.

Stefan
Stefan Hajnoczi Aug. 5, 2011, 8:58 a.m. UTC | #3
On Fri, Aug 5, 2011 at 7:22 AM, malc <av1474@comtv.ru> wrote:
>
> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
>
> diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
> index 41c2379..42dc3e2 100644
> --- a/coroutine-ucontext.c
> +++ b/coroutine-ucontext.c
> @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>     CoroutineUContext *co;
>     ucontext_t old_uc, uc;
>     jmp_buf old_env;
> -    union cc_arg arg;
> +    union cc_arg arg = {0};
>
>     /* The ucontext functions preserve signal masks which incurs a system call
>      * overhead.  setjmp()/longjmp() does not preserve signal masks but only
>
> I guess gcc should yell not only here on ppc32 but on any machine where
> pointer size is less than the size of two ints.

Makes sense.  Are you going to commit a fix or send a signed-off-by patch?

Stefan
Kevin Wolf Aug. 5, 2011, 9:09 a.m. UTC | #4
Am 05.08.2011 10:48, schrieb Stefan Hajnoczi:
> On Fri, Aug 5, 2011 at 8:29 AM, Kevin Wolf <kwolf@redhat.com> wrote:
>> Am 05.08.2011 08:22, schrieb malc:
>>>
>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
>>>
>>> diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
>>> index 41c2379..42dc3e2 100644
>>> --- a/coroutine-ucontext.c
>>> +++ b/coroutine-ucontext.c
>>> @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>>>      CoroutineUContext *co;
>>>      ucontext_t old_uc, uc;
>>>      jmp_buf old_env;
>>> -    union cc_arg arg;
>>> +    union cc_arg arg = {0};
>>>
>>>      /* The ucontext functions preserve signal masks which incurs a system call
>>>       * overhead.  setjmp()/longjmp() does not preserve signal masks but only
>>>
>>> I guess gcc should yell not only here on ppc32 but on any machine where
>>> pointer size is less than the size of two ints.
>>
>> Stefan, why does this code even exist again? I think at some point I had
>> it changed to just use a static variable in order to avoid doing this
>> kind of tricks with unions.
> 
> virtfs are using coroutines in multiple threads at the same time.
> Introducing a global variable wouldn't be thread-safe.
> 
> The real problem is that makecontext(3) has a bad function signature.
> There's no nice fix - whatever we do will be ugly.
> 
> Using a union is the way it should be done in C.  The code doesn't
> look pretty but it doesn't introduce global state.

But it makes assumptions about the pointer size, which isn't a nice
thing. TLS isn't an option for compatibility with some OSes/architectures?

Kevin
Stefan Hajnoczi Aug. 5, 2011, 9:37 a.m. UTC | #5
On Fri, Aug 5, 2011 at 10:09 AM, Kevin Wolf <kwolf@redhat.com> wrote:
> Am 05.08.2011 10:48, schrieb Stefan Hajnoczi:
>> On Fri, Aug 5, 2011 at 8:29 AM, Kevin Wolf <kwolf@redhat.com> wrote:
>>> Am 05.08.2011 08:22, schrieb malc:
>>>>
>>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
>>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
>>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
>>>>
>>>> diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
>>>> index 41c2379..42dc3e2 100644
>>>> --- a/coroutine-ucontext.c
>>>> +++ b/coroutine-ucontext.c
>>>> @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>>>>      CoroutineUContext *co;
>>>>      ucontext_t old_uc, uc;
>>>>      jmp_buf old_env;
>>>> -    union cc_arg arg;
>>>> +    union cc_arg arg = {0};
>>>>
>>>>      /* The ucontext functions preserve signal masks which incurs a system call
>>>>       * overhead.  setjmp()/longjmp() does not preserve signal masks but only
>>>>
>>>> I guess gcc should yell not only here on ppc32 but on any machine where
>>>> pointer size is less than the size of two ints.
>>>
>>> Stefan, why does this code even exist again? I think at some point I had
>>> it changed to just use a static variable in order to avoid doing this
>>> kind of tricks with unions.
>>
>> virtfs are using coroutines in multiple threads at the same time.
>> Introducing a global variable wouldn't be thread-safe.
>>
>> The real problem is that makecontext(3) has a bad function signature.
>> There's no nice fix - whatever we do will be ugly.
>>
>> Using a union is the way it should be done in C.  The code doesn't
>> look pretty but it doesn't introduce global state.
>
> But it makes assumptions about the pointer size, which isn't a nice
> thing. TLS isn't an option for compatibility with some OSes/architectures?

GThread TLS is portable but slow in my testing.

You are right, when we move to 128-bit pointers this code will break
:).  We could at add a #warning if pointer size > 64-bits.

Stefan
malc Aug. 5, 2011, 4:49 p.m. UTC | #6
On Fri, 5 Aug 2011, Stefan Hajnoczi wrote:

> On Fri, Aug 5, 2011 at 7:22 AM, malc <av1474@comtv.ru> wrote:
> >
> > /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
> > /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
> > /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
> >
> > diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
> > index 41c2379..42dc3e2 100644
> > --- a/coroutine-ucontext.c
> > +++ b/coroutine-ucontext.c
> > @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
> >     CoroutineUContext *co;
> >     ucontext_t old_uc, uc;
> >     jmp_buf old_env;
> > -    union cc_arg arg;
> > +    union cc_arg arg = {0};
> >
> >     /* The ucontext functions preserve signal masks which incurs a system call
> >      * overhead.  setjmp()/longjmp() does not preserve signal masks but only
> >
> > I guess gcc should yell not only here on ppc32 but on any machine where
> > pointer size is less than the size of two ints.
> 
> Makes sense.  Are you going to commit a fix or send a signed-off-by patch?
> 

If the author(s)(you and Kevin? just you?) agree with the above i can just 
push it.
Stefan Hajnoczi Aug. 6, 2011, 6:12 a.m. UTC | #7
On Fri, Aug 5, 2011 at 5:49 PM, malc <av1474@comtv.ru> wrote:
> On Fri, 5 Aug 2011, Stefan Hajnoczi wrote:
>
>> On Fri, Aug 5, 2011 at 7:22 AM, malc <av1474@comtv.ru> wrote:
>> >
>> > /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
>> > /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
>> > /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
>> >
>> > diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
>> > index 41c2379..42dc3e2 100644
>> > --- a/coroutine-ucontext.c
>> > +++ b/coroutine-ucontext.c
>> > @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>> >     CoroutineUContext *co;
>> >     ucontext_t old_uc, uc;
>> >     jmp_buf old_env;
>> > -    union cc_arg arg;
>> > +    union cc_arg arg = {0};
>> >
>> >     /* The ucontext functions preserve signal masks which incurs a system call
>> >      * overhead.  setjmp()/longjmp() does not preserve signal masks but only
>> >
>> > I guess gcc should yell not only here on ppc32 but on any machine where
>> > pointer size is less than the size of two ints.
>>
>> Makes sense.  Are you going to commit a fix or send a signed-off-by patch?
>>
>
> If the author(s)(you and Kevin? just you?) agree with the above i can just
> push it.

The change makes sense to me.

Kevin?

Stefan
Kevin Wolf Aug. 8, 2011, 8:02 a.m. UTC | #8
Am 05.08.2011 18:49, schrieb malc:
> On Fri, 5 Aug 2011, Stefan Hajnoczi wrote:
> 
>> On Fri, Aug 5, 2011 at 7:22 AM, malc <av1474@comtv.ru> wrote:
>>>
>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c: In function 'coroutine_new':
>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:160:16: error: 'arg.i[1]' may be used uninitialized in this function
>>> /home/malc/x/rcs/git/qemuorg/coroutine-ucontext.c:136:18: note: 'arg.i[1]' was declared here
>>>
>>> diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
>>> index 41c2379..42dc3e2 100644
>>> --- a/coroutine-ucontext.c
>>> +++ b/coroutine-ucontext.c
>>> @@ -133,7 +133,7 @@ static Coroutine *coroutine_new(void)
>>>     CoroutineUContext *co;
>>>     ucontext_t old_uc, uc;
>>>     jmp_buf old_env;
>>> -    union cc_arg arg;
>>> +    union cc_arg arg = {0};
>>>
>>>     /* The ucontext functions preserve signal masks which incurs a system call
>>>      * overhead.  setjmp()/longjmp() does not preserve signal masks but only
>>>
>>> I guess gcc should yell not only here on ppc32 but on any machine where
>>> pointer size is less than the size of two ints.
>>
>> Makes sense.  Are you going to commit a fix or send a signed-off-by patch?
>>
> 
> If the author(s)(you and Kevin? just you?) agree with the above i can just 
> push it.

Feel free to push it. (Original code was by Anthony, then heavily
modified by me, and after that modified again by Stefan)

Acked-by: Kevin Wolf <kwolf@redhat.com>
malc Aug. 8, 2011, 10:40 a.m. UTC | #9
On Mon, 8 Aug 2011, Kevin Wolf wrote:

> Am 05.08.2011 18:49, schrieb malc:
> > On Fri, 5 Aug 2011, Stefan Hajnoczi wrote:
> > 

[..snip..]

> 
> Feel free to push it. (Original code was by Anthony, then heavily
> modified by me, and after that modified again by Stefan)
> 
> Acked-by: Kevin Wolf <kwolf@redhat.com>

Pushed.
diff mbox

Patch

diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
index 41c2379..42dc3e2 100644
--- a/coroutine-ucontext.c
+++ b/coroutine-ucontext.c
@@ -133,7 +133,7 @@  static Coroutine *coroutine_new(void)
     CoroutineUContext *co;
     ucontext_t old_uc, uc;
     jmp_buf old_env;
-    union cc_arg arg;
+    union cc_arg arg = {0};
 
     /* The ucontext functions preserve signal masks which incurs a system call
      * overhead.  setjmp()/longjmp() does not preserve signal masks but only