[FFmpeg-devel] [PATCH 17/19] avfilter/vf_signature: Avoid cast from function pointer to void*

Paul B Mahol onemda at gmail.com
Wed Aug 26 23:26:16 EEST 2020


On 8/25/20, Andreas Rheinhardt <andreas.rheinhardt at gmail.com> wrote:
> The signature filter uses qsort, but its compare function doesn't have
> the signature required of such a function; therefore it casts the function
> pointer to void. Yet this is wrong:
> C90 only guarantees that one can convert a pointer to any incomplete
> type or object type to void* and back with the result comparing equal
> to the original which makes pointers to void generic pointers to
> incomplete or object type. Yet C90 lacks a generic function pointer
> type.
> C99 additionally guarantees that a pointer to a function of one type may
> be converted to a pointer to a function of another type with the result
> and the original comparing equal when converting back.
> This makes any function pointer type a generic function pointer type.
> Yet even this does not make pointers to void generic function pointers.
>
> Both GCC and Clang emit warnings for this when in pedantic mode.
>
> This commit fixes this by modifying the compare function to comply with
> the expected signature.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavfilter/vf_signature.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>

LGTM

> diff --git a/libavfilter/vf_signature.c b/libavfilter/vf_signature.c
> index 80957d0047..32a6405e14 100644
> --- a/libavfilter/vf_signature.c
> +++ b/libavfilter/vf_signature.c
> @@ -132,8 +132,9 @@ static uint64_t get_block_sum(StreamContext *sc,
> uint64_t intpic[32][32], const
>      return sum;
>  }
>
> -static int cmp(const uint64_t *a, const uint64_t *b)
> +static int cmp(const void *x, const void *y)
>  {
> +    const uint64_t *a = x, *b = y;
>      return *a < *b ? -1 : ( *a > *b ? 1 : 0 );
>  }
>
> @@ -291,7 +292,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
> *picref)
>          }
>
>          /* get threshold */
> -        qsort(sortsignature, elemcat->elem_count, sizeof(uint64_t), (void*)
> cmp);
> +        qsort(sortsignature, elemcat->elem_count, sizeof(uint64_t), cmp);
>          th = sortsignature[(int) (elemcat->elem_count*0.333)];
>
>          /* ternarize */
> @@ -317,7 +318,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
> *picref)
>      }
>
>      /* confidence */
> -    qsort(conflist, DIFFELEM_SIZE, sizeof(uint64_t), (void*) cmp);
> +    qsort(conflist, DIFFELEM_SIZE, sizeof(uint64_t), cmp);
>      fs->confidence = FFMIN(conflist[DIFFELEM_SIZE/2], 255);
>
>      /* coarsesignature */
> --
> 2.20.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list