[FFmpeg-devel] [PATCH 1/4] lavu: add simple array implementation
Lukasz Marek
lukasz.m.luki2 at gmail.com
Fri Mar 21 01:26:28 CET 2014
On 21.03.2014 00:03, Michael Niedermayer wrote:
> On Thu, Mar 20, 2014 at 10:44:41PM +0100, Lukasz Marek wrote:
>>>> mem.c | 13 +++++++++++++
>>>> mem.h | 19 +++++++++++++++++--
>>>> 2 files changed, 30 insertions(+), 2 deletions(-)
>>>> 7fad1be9083fcaef4435fa0273f79bceca98821b 0001-lavu-mem-add-av_dynarray_add_nofree-function.patch
>>>> From 4cadb3328ba018b37c5dfe05a637b50a262151c6 Mon Sep 17 00:00:00 2001
>>>> From: Lukasz Marek <lukasz.m.luki at gmail.com>
>>>> Date: Tue, 25 Feb 2014 01:06:06 +0100
>>>> Subject: [PATCH] lavu/mem: add av_dynarray_add_nofree function
>>>>
>>>> av_dynarray_add_nofree function have similar functionality
>>>> as existing av_dynarray_add, but it doesn't deallocate memory
>>>> on fails.
>>>>
>>>> TODO: minor bump and update doc/APIChanges
>>>>
>>>> Signed-off-by: Lukasz Marek <lukasz.m.luki at gmail.com>
>>>> ---
>>>> libavutil/mem.c | 13 +++++++++++++
>>>> libavutil/mem.h | 19 +++++++++++++++++--
>>>> 2 files changed, 30 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libavutil/mem.c b/libavutil/mem.c
>>>> index 7206ddc..b9b5742 100644
>>>> --- a/libavutil/mem.c
>>>> +++ b/libavutil/mem.c
>>>> @@ -278,6 +278,19 @@ void *av_memdup(const void *p, size_t size)
>>>> return ptr;
>>>> }
>>>>
>>>> +int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
>>>> +{
>>>
>>>> + intptr_t *tab = *(intptr_t**)tab_ptr;
>>>
>>> undefined behavior (strict aliasing violation)
>>
>>
>> Can you tell how it is wrong?
>
> yes sure
>
> quoting the spec:
>
> 7 An object shall have its stored value accessed only by an lvalue expression that has one of
> the following types:76)
> - a type compatible with the effective type of the object,
> - a qualified version of a type compatible with the effective type of the object,
> - a type that is the signed or unsigned type corresponding to the effective type of the
> object,
> - a type that is the signed or unsigned type corresponding to a qualified version of the
> effective type of the object,
> - an aggregate or union type that includes one of the aforementioned types among its
> members (including, recursively, a member of a subaggregate or contained union), or
> - a character type.
>
>
> i dont think intptr_t and some pointer are compatible types
> but maybe iam missing something
tab_ptr is pointer to pointer to array data
so this can be replaced by something similar and (maybe) less misleading
intptr_t *tab = *(void**)tab_ptr;
This line is copied from Nicolas implementation/original implementation.
Still don't know what strict aliasing have anything to do here.
Best Regards,
Lukasz Marek
More information about the ffmpeg-devel
mailing list