[v8-users] Re: ArrayBuffer::Allocator::Free() length differing from Allocate() length?

2018-03-14 Thread Zac Hansen
Have you compiled with ASAN?   Presumably if you're deleting more memory 
than you have, that would fire.  Just for debugging this, you could even 
put in a map of allocated addresses and sizes and just track what requests 
come in that don't seem to match.

It seems like requests that would cause this to go negative would end up 
sticking out like a sore thumb.

On Wednesday, March 14, 2018 at 6:36:33 PM UTC-7, Kenton Varda wrote:
>
> Hi v8-users,
>
> We have an ArrayBufferAllocator implementation that counts how much memory 
> has been allocated. It basically looks like this:
>
> class AllocatorImpl final: public v8::ArrayBuffer::Allocator {
>
> public:
>
>   AllocatorImpl(): allocated(0) {}
>
>   ~AllocatorImpl();
>
>
>   inline size_t getMemoryUsage() const { return allocated; }
>
>
>   void* Allocate(size_t length) {
>
> allocated += length;
>
> return calloc(length, 1);
>
>   }
>
>   void* AllocateUninitialized(size_t length) {
>
> allocated += length;
>
> return malloc(length);
>
>   }
>
>   void Free(void* data, size_t length) {
>
> allocated -= length;
>
> free(data);
>
>   }
>
>
> private:
>
>   size_t allocated;
>
> };
>
>
> We're observing something strange: Sometimes (very rarely!), the 
> `allocated` value drops below zero and wraps around, apparently indicating 
> that V8 has Free()'d more than it Allocate()ed. However, there don't seem 
> to be any issues with double-frees or freeing an invalid pointer.
>
> Any idea what could lead to this? Is it possible for V8 to pass a 
> different `legth` value to Free() than it passed to Allocate()?
>
> Unfortunately I have no idea how to reproduce this reliably. It only 
> happens very occasionally in production. :/
>
> -Kenton
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[v8-users] ArrayBuffer::Allocator::Free() length differing from Allocate() length?

2018-03-14 Thread 'Kenton Varda' via v8-users
Hi v8-users,

We have an ArrayBufferAllocator implementation that counts how much memory
has been allocated. It basically looks like this:

class AllocatorImpl final: public v8::ArrayBuffer::Allocator {

public:

  AllocatorImpl(): allocated(0) {}

  ~AllocatorImpl();


  inline size_t getMemoryUsage() const { return allocated; }


  void* Allocate(size_t length) {

allocated += length;

return calloc(length, 1);

  }

  void* AllocateUninitialized(size_t length) {

allocated += length;

return malloc(length);

  }

  void Free(void* data, size_t length) {

allocated -= length;

free(data);

  }


private:

  size_t allocated;

};


We're observing something strange: Sometimes (very rarely!), the
`allocated` value drops below zero and wraps around, apparently indicating
that V8 has Free()'d more than it Allocate()ed. However, there don't seem
to be any issues with double-frees or freeing an invalid pointer.

Any idea what could lead to this? Is it possible for V8 to pass a different
`legth` value to Free() than it passed to Allocate()?

Unfortunately I have no idea how to reproduce this reliably. It only
happens very occasionally in production. :/

-Kenton

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.