Re: Nasty typecasting / alignment issues in libdvbpsi

Jean-Paul Saman <[email protected]>
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <CAK9US3BmRzmUVw-FGppYeKST7dHEE43FqWov3j+G1cg=+v3G_g@mail.gmail.com>
On Mon, Oct 15, 2012 at 12:30 PM, Martin Jackson
<[email protected]> 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
> [email protected]
> http://mailman.videolan.org/listinfo/libdvbpsi-devel
_______________________________________________
libdvbpsi-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libdvbpsi-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.