[Spice-devel] [PATCH 11/11] dcc: remove not necessary volatile specifications
Frediano Ziglio
fziglio at redhat.com
Fri Feb 12 11:14:06 UTC 2016
>
> [NB: this did not go to the ML]
> On Fri, Feb 12, 2016 at 05:12:57AM -0500, Frediano Ziglio wrote:
> > >
> > > This causes:
> > > make[4]: Entering directory '/home/teuf/redhat/spice/server'
> > > CC dcc.lo
> > > dcc.c: In function 'dcc_compress_image_jpeg':
> > > dcc.c:852:26: error: variable 'jpeg_in_type' might be clobbered by
> > > 'longjmp'
> > > or 'vfork' [-Werror=clobbered]
> > > JpegEncoderImageType jpeg_in_type;
> > > ^
> > > dcc.c:854:9: error: variable 'has_alpha' might be clobbered by 'longjmp'
> > > or
> > > 'vfork' [-Werror=clobbered]
> > > int has_alpha = FALSE;
> > > ^
> > > dcc.c: In function 'dcc_compress_image_quic.isra.10':
> > > dcc.c:1020:19: error: variable 'type' might be clobbered by 'longjmp' or
> > > 'vfork' [-Werror=clobbered]
> > > QuicImageType type;
> > > ^
> > >
> > > not sure why...
> > >
> >
> > Sometimes compilers have these limits :)
> >
> > I think in this case it assumes (for strange reasons) that a longjmp can
> > go back to a point and change the variable without code noticing.
> >
> > From man
> >
> > The values of automatic variables are unspecified after a call to
> > longjmp() if they meet all the following criteria:
> > · they are local to the function that made the corresponding
> > setjmp(3) call;
> > · their values are changed between the calls to setjmp(3) and
> > longjmp(); and
> > · they are not declared as volatile.
> >
> > So compiler did detect a possible condition 2 ("their values are changed
> > "...)
>
> hmm but they are not actually changed between the setjmp/longjmp calls,
> are they? Could be a compiler issue then? Though they are saying 'might'
>
> Christophe
>
This (ugly) patch solve the issue...
diff --git a/server/dcc.c b/server/dcc.c
index bd25069..afd01e5 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -849,9 +849,9 @@ static int dcc_compress_image_jpeg(DisplayChannelClient *dcc, SpiceImage *dest,
LzData *lz_data = &dcc->lz_data;
JpegEncoderContext *jpeg = dcc->jpeg;
LzContext *lz = dcc->lz;
- JpegEncoderImageType jpeg_in_type;
+ JpegEncoderImageType jpeg_in_type_tmp;
int jpeg_size = 0;
- int has_alpha = FALSE;
+ int has_alpha_tmp = FALSE;
int alpha_lz_size = 0;
int comp_head_filled;
int comp_head_left;
@@ -862,22 +862,25 @@ static int dcc_compress_image_jpeg(DisplayChannelClient *dcc, SpiceImage *dest,
switch (src->format) {
case SPICE_BITMAP_FMT_16BIT:
- jpeg_in_type = JPEG_IMAGE_TYPE_RGB16;
+ jpeg_in_type_tmp = JPEG_IMAGE_TYPE_RGB16;
break;
case SPICE_BITMAP_FMT_24BIT:
- jpeg_in_type = JPEG_IMAGE_TYPE_BGR24;
+ jpeg_in_type_tmp = JPEG_IMAGE_TYPE_BGR24;
break;
case SPICE_BITMAP_FMT_32BIT:
- jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
+ jpeg_in_type_tmp = JPEG_IMAGE_TYPE_BGRX32;
break;
case SPICE_BITMAP_FMT_RGBA:
- jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
- has_alpha = TRUE;
+ jpeg_in_type_tmp = JPEG_IMAGE_TYPE_BGRX32;
+ has_alpha_tmp = TRUE;
break;
default:
return FALSE;
}
+ const JpegEncoderImageType jpeg_in_type = jpeg_in_type_tmp;
+ const int has_alpha = has_alpha_tmp;
+
encoder_data_init(&jpeg_data->data, dcc);
if (setjmp(jpeg_data->data.jmp_env)) {
@@ -1017,28 +1020,30 @@ static int dcc_compress_image_quic(DisplayChannelClient *dcc, SpiceImage *dest,
{
QuicData *quic_data = &dcc->quic_data;
QuicContext *quic = dcc->quic;
- QuicImageType type;
+ QuicImageType type_tmp;
int size, stride;
stat_start_time_t start_time;
stat_start_time_init(&start_time, &DCC_TO_DC(dcc)->quic_stat);
switch (src->format) {
case SPICE_BITMAP_FMT_32BIT:
- type = QUIC_IMAGE_TYPE_RGB32;
+ type_tmp = QUIC_IMAGE_TYPE_RGB32;
break;
case SPICE_BITMAP_FMT_RGBA:
- type = QUIC_IMAGE_TYPE_RGBA;
+ type_tmp = QUIC_IMAGE_TYPE_RGBA;
break;
case SPICE_BITMAP_FMT_16BIT:
- type = QUIC_IMAGE_TYPE_RGB16;
+ type_tmp = QUIC_IMAGE_TYPE_RGB16;
break;
case SPICE_BITMAP_FMT_24BIT:
- type = QUIC_IMAGE_TYPE_RGB24;
+ type_tmp = QUIC_IMAGE_TYPE_RGB24;
break;
default:
return FALSE;
}
+ const QuicImageType type = type_tmp;
+
encoder_data_init(&quic_data->data, dcc);
if (setjmp(quic_data->data.jmp_env)) {
No, I'm not proposing it, just saying that perhaps the compiler is too cautious.
On the other side volatile == keep in memory and don't optimize... weird!
Frediano
More information about the Spice-devel
mailing list