[libdvbpsi-devel] Nasty typecasting / alignment issues in libdvbpsi

Jean-Paul Saman jpsaman at videolan.org
Tue Oct 16 11:03:43 CEST 2012


On Mon, Oct 15, 2012 at 12:30 PM, Martin Jackson
<mjackson220.list at gmail.com> wrote:
> Dear livdvbpsi developers,
>
> When compiling for host=mipsel-linux-uclibc (mipsel-linux-uclibc-gcc
> (GCC) 4.2.0), I ran into some rather horrible alignment issues related
> to typecasting of the various table structures.

Thanks for reporting this issue, I am looking into it.

> I got the following warnings (which become errors due to -Werror)
> using the latest git as of today
> (398ff6bac45aeda35320ff1b7535e726290af821)
>
> libtool: compile:  mipsel-linux-uclibc-gcc -DHAVE_CONFIG_H -I. -I.. -g
> -O2 -Wall -Werror --std=gnu99 -D_GNU_SOURCE -Wpointer-arith
> -Wcast-align -Wcast-qual -Wstrict-prototypes -Wshadow
> -Waggregate-return -Wmissing-prototypes -Wnested-externs
> -Wsign-compare -DDVBPSI_DIST -MT tot.lo -MD -MP -MF .deps/tot.Tpo -c
> tables/tot.c  -fPIC -DPIC -o .libs/tot.o
> cc1: warnings being treated as errors
> tables/tot.c: In function 'dvbpsi_tot_attach':
> tables/tot.c:78: warning: cast increases required alignment of target type
> tables/tot.c: In function 'dvbpsi_tot_detach':
> tables/tot.c:131: warning: cast increases required alignment of target type
> tables/tot.c: In function 'dvbpsi_tot_sections_gather':
> tables/tot.c:326: warning: cast increases required alignment of target type
>
>
> For example, in src/tables/tot.c:78
>     dvbpsi_tot_decoder_t *p_tot_decoder;
>     p_tot_decoder = (dvbpsi_tot_decoder_t *) dvbpsi_decoder_new(NULL,
>                                                 0, true,
> sizeof(dvbpsi_tot_decoder_t));
>
> So apparently, p_tot_decoder potentially has a different alignment to
> the result of dvbpsi_decoder_new. I imagine that this could lead to a
> crash in libdvbpsi if the warning is ignored. Also, a separate issue:

The DVBPSI_DECODER_COMMON members of dvbpsi_decoder_t are not alligned, which
is probably the cause of the compiler complaining.

> the libdvbpsi library appears not to compile without -Werror either
> for my mips toolchain or the regular centOS x86_64 toolchain, though I
> didn't have time to investigate.

-Werror is forced in configure.ac

Kind regards,

Jean-Paul Saman.

> Best regards,
>
> Martin Jackson
>
>
> I got it compiling with the following hacks: (no suggestion that this
> patch should be merged, it's nonsense but it got the job done for now)
>
> diff --git a/src/demux.h b/src/demux.h
> index 73b4ae0..c348153 100644
> --- a/src/demux.h
> +++ b/src/demux.h
> @@ -126,7 +126,7 @@ struct dvbpsi_demux_s
>      dvbpsi_demux_new_cb_t     pf_new_callback;    /*!< New subtable callback */
>      void *                    p_new_cb_data;      /*!< Data provided to the
>                                                       previous callback */
> -};
> +} __attribute__((__aligned__(128)));
>
>  /*****************************************************************************
>   * dvbpsi_AttachDemux
> @@ -211,7 +211,7 @@ typedef void (* dvbpsi_callback_gather_t)(dvbpsi_t
> *p_dvbpsi,  /*!< pointer to d
>  struct dvbpsi_decoder_s
>  {
>      DVBPSI_DECODER_COMMON
> -};
> +} __attribute__((__aligned__(128)));
>
>  /*****************************************************************************
>   * dvbpsi_decoder_new
> diff --git a/src/tables/atsc_eit.h b/src/tables/atsc_eit.h
> index 82f72d6..94bb5da 100644
> --- a/src/tables/atsc_eit.h
> +++ b/src/tables/atsc_eit.h
> @@ -83,7 +83,7 @@ typedef struct dvbpsi_atsc_eit_s
>      dvbpsi_atsc_eit_event_t   *p_first_event;   /*!< First event
> information structure. */
>
>      dvbpsi_descriptor_t     *p_first_descriptor; /*!< First
> descriptor structure. */
> -} dvbpsi_atsc_eit_t;
> +} __attribute__((__aligned__(128))) dvbpsi_atsc_eit_t;
>
>  /*****************************************************************************
>   * dvbpsi_eit_callback
> diff --git a/src/tables/atsc_ett.h b/src/tables/atsc_ett.h
> index 6baaf61..4f6eb76 100644
> --- a/src/tables/atsc_ett.h
> +++ b/src/tables/atsc_ett.h
> @@ -70,7 +70,7 @@ typedef struct dvbpsi_atsc_ett_s
>                                                   multiple string structure */
>
>      dvbpsi_descriptor_t    *p_first_descriptor; /*!< First descriptor. */
> -} dvbpsi_atsc_ett_t;
> +} __attribute__((__aligned__(128)))  dvbpsi_atsc_ett_t;
>
>  /*****************************************************************************
>   * dvbpsi_atsc_ett_callback
> diff --git a/src/tables/atsc_mgt.h b/src/tables/atsc_mgt.h
> index d55fdad..004c44a 100644
> --- a/src/tables/atsc_mgt.h
> +++ b/src/tables/atsc_mgt.h
> @@ -83,7 +83,7 @@ typedef struct dvbpsi_atsc_mgt_s
>      dvbpsi_atsc_mgt_table_t   *p_first_table;   /*!< First table
> information structure. */
>
>      dvbpsi_descriptor_t    *p_first_descriptor; /*!< First descriptor. */
> -} dvbpsi_atsc_mgt_t;
> +} __attribute__((__aligned__(128))) dvbpsi_atsc_mgt_t;
>
>  /*****************************************************************************
>   * dvbpsi_mgt_callback
> diff --git a/src/tables/atsc_stt.h b/src/tables/atsc_stt.h
> index eca622c..de620c4 100644
> --- a/src/tables/atsc_stt.h
> +++ b/src/tables/atsc_stt.h
> @@ -55,7 +55,7 @@ typedef struct dvbpsi_atsc_stt_s
>      uint16_t                i_daylight_savings; /*!< Daylight savings
> control bytes. */
>
>      dvbpsi_descriptor_t    *p_first_descriptor; /*!< First descriptor. */
> -} dvbpsi_atsc_stt_t;
> +} __attribute__((__aligned__(128)))  dvbpsi_atsc_stt_t;
>
>  /*****************************************************************************
>   * dvbpsi_atsc_stt_callback
> diff --git a/src/tables/atsc_vct.h b/src/tables/atsc_vct.h
> index cfe7e9e..7c395c8 100644
> --- a/src/tables/atsc_vct.h
> +++ b/src/tables/atsc_vct.h
> @@ -97,7 +97,7 @@ typedef struct dvbpsi_atsc_vct_s
>      dvbpsi_descriptor_t         *p_first_descriptor; /*!< First descriptor. */
>      dvbpsi_atsc_vct_channel_t   *p_first_channel;    /*!< First
> channel information structure. */
>
> -} dvbpsi_atsc_vct_t;
> +} __attribute__((__aligned__(128))) dvbpsi_atsc_vct_t;
>
>  /*****************************************************************************
>   * dvbpsi_vct_callback
> diff --git a/src/tables/bat_private.h b/src/tables/bat_private.h
> index ac6f726..5414902 100644
> --- a/src/tables/bat_private.h
> +++ b/src/tables/bat_private.h
> @@ -44,7 +44,7 @@ typedef struct dvbpsi_bat_decoder_s
>      dvbpsi_bat_t                  current_bat;
>      dvbpsi_bat_t *                p_building_bat;
>
> -} dvbpsi_bat_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_bat_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_bat_sections_gather
> diff --git a/src/tables/cat_private.h b/src/tables/cat_private.h
> index 93b862c..3269e49 100644
> --- a/src/tables/cat_private.h
> +++ b/src/tables/cat_private.h
> @@ -45,7 +45,7 @@ typedef struct dvbpsi_cat_decoder_s
>      dvbpsi_cat_t                  current_cat;
>      dvbpsi_cat_t *                p_building_cat;
>
> -} dvbpsi_cat_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_cat_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_cat_sections_gather
> diff --git a/src/tables/eit_private.h b/src/tables/eit_private.h
> index 1bf9108..8af52ea 100644
> --- a/src/tables/eit_private.h
> +++ b/src/tables/eit_private.h
> @@ -45,7 +45,7 @@ typedef struct dvbpsi_eit_decoder_s
>
>      uint8_t                       i_first_received_section_number;
>
> -} dvbpsi_eit_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_eit_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_eit_sections_gather
> diff --git a/src/tables/nit_private.h b/src/tables/nit_private.h
> index 8eadce7..d1ccc8c 100644
> --- a/src/tables/nit_private.h
> +++ b/src/tables/nit_private.h
> @@ -47,7 +47,7 @@ typedef struct dvbpsi_nit_decoder_s
>      dvbpsi_nit_t                  current_nit;
>      dvbpsi_nit_t *                p_building_nit;
>
> -} dvbpsi_nit_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_nit_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_nit_sections_gather
> diff --git a/src/tables/pat_private.h b/src/tables/pat_private.h
> index 8801b0d..188e38b 100644
> --- a/src/tables/pat_private.h
> +++ b/src/tables/pat_private.h
> @@ -43,7 +43,7 @@ typedef struct dvbpsi_pat_decoder_s
>      dvbpsi_pat_t                  current_pat;
>      dvbpsi_pat_t *                p_building_pat;
>
> -} dvbpsi_pat_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_pat_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_pat_sections_gather
> diff --git a/src/tables/pmt_private.h b/src/tables/pmt_private.h
> index ed75a8b..2b936bd 100644
> --- a/src/tables/pmt_private.h
> +++ b/src/tables/pmt_private.h
> @@ -45,7 +45,7 @@ typedef struct dvbpsi_pmt_decoder_s
>      dvbpsi_pmt_t                  current_pmt;
>      dvbpsi_pmt_t *                p_building_pmt;
>
> -} dvbpsi_pmt_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_pmt_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_pmt_sections_gather
> diff --git a/src/tables/rst_private.h b/src/tables/rst_private.h
> index 2f1664e..c391f76 100644
> --- a/src/tables/rst_private.h
> +++ b/src/tables/rst_private.h
> @@ -42,7 +42,7 @@ typedef struct dvbpsi_rst_decoder_s
>      dvbpsi_rst_t                  current_rst;
>      dvbpsi_rst_t *                p_building_rst;
>
> -} dvbpsi_rst_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_rst_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_GatherRSTSections
> diff --git a/src/tables/sdt_private.h b/src/tables/sdt_private.h
> index 1a84dba..b1219fe 100644
> --- a/src/tables/sdt_private.h
> +++ b/src/tables/sdt_private.h
> @@ -43,7 +43,7 @@ typedef struct dvbpsi_sdt_decoder_s
>      dvbpsi_sdt_t                  current_sdt;
>      dvbpsi_sdt_t *                p_building_sdt;
>
> -} dvbpsi_sdt_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_sdt_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_sdt_sections_gather
> diff --git a/src/tables/sis_private.h b/src/tables/sis_private.h
> index d539b00..fc69451 100644
> --- a/src/tables/sis_private.h
> +++ b/src/tables/sis_private.h
> @@ -43,7 +43,7 @@ typedef struct dvbpsi_sis_decoder_s
>      dvbpsi_sis_t                  current_sis;
>      dvbpsi_sis_t                  *p_building_sis;
>
> -} dvbpsi_sis_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_sis_decoder_t;
>
>  /*****************************************************************************
>   * dvbpsi_sis_sections_gather
> diff --git a/src/tables/tot_private.h b/src/tables/tot_private.h
> index 86ac502..9a43a8f 100644
> --- a/src/tables/tot_private.h
> +++ b/src/tables/tot_private.h
> @@ -46,7 +46,7 @@ typedef struct dvbpsi_tot_decoder_s
>      dvbpsi_tot_t                  current_tot;
>      dvbpsi_tot_t                  *p_building_tot;
>
> -} dvbpsi_tot_decoder_t;
> +} __attribute__((__aligned__(128))) dvbpsi_tot_decoder_t;
>
>
>  /*****************************************************************************
> _______________________________________________
> libdvbpsi-devel mailing list
> libdvbpsi-devel at videolan.org
> http://mailman.videolan.org/listinfo/libdvbpsi-devel


More information about the libdvbpsi-devel mailing list