[Bug 1672] New: Heap protection

bugzilla-daemon at rtems.org bugzilla-daemon at rtems.org
Thu Aug 12 10:35:19 UTC 2010


https://www.rtems.org/bugzilla/show_bug.cgi?id=1672

           Summary: Heap protection
           Product: RTEMS
           Version: HEAD
          Platform: All
        OS/Version: RTEMS
            Status: NEW
          Severity: enhancement
          Priority: P3
         Component: cpukit
        AssignedTo: joel.sherrill at oarcorp.com
        ReportedBy: sebastian.huber at embedded-brains.de


I have a debug support for the super core heap handler.  It covers boundary
violations, general heap block corruption, double free and usage of freed
memory.  The space overhead is 7 words per heap block.  The time overhead is
minimal for allocations and during free it depends on the allocation size (the
freed memory will be marked with a pattern).  There are also non-deterministic
work loads during free.

It is plugable with handlers for block initialization, checks and errors:

  typedef struct {
    void *handler_data;
    void (*init_block)(Heap_Control *heap, Heap_Block *block);
    bool (*check_block)(Heap_Control *heap, Heap_Block *block);
    void (*block_error)(Heap_Control *heap, Heap_Block *block);
    Heap_Block *first_delayed_free_block;
    Heap_Block *last_delayed_free_block;
    uintptr_t delayed_free_block_count;
  } Heap_Protection;

If enabled, this structure is a part of Heap_Control.  The handler functions
will be called by the general heap code.

In order to check if a heap block (Heap_Block) is valid I added protector
fields:

  typedef struct {
    uintptr_t protector [HEAP_PROTECTOR_COUNT];
    Heap_Block *next_delayed_free_block;
    Thread_Control *task;
    void *tag;
  } Heap_Block_protection_begin;

  typedef struct {
    uintptr_t protector [HEAP_PROTECTOR_COUNT];
  } Heap_Block_protection_end;

The task and tag fields are optional.  They are useful for debugging problems
related to usage of freed memory.  The task field points to the task which
allocated the memory.  The tag field should be set by high level allocation
functions to give a hint about the user, e.g. the return address of the
allocation function.

struct Heap_Block {
  uintptr_t prev_size;

  #ifdef HEAP_PROTECTION
    Heap_Block_protection_begin Protection_begin;
  #endif

  uintptr_t size_and_flag;

  #ifdef HEAP_PROTECTION
    Heap_Block_protection_end Protection_end;
  #endif

  Heap_Block *next;
  Heap_Block *prev;
};

Here we have a space and time overhead which may be to much for certain
applications, thus I would not enable this feature by default.  I would enable
it depending on RTEMS_DEBUG.  If you have a heap problem in a production system
you deserve evil consequences.  The heap protection should be an aid during
debugging.

-- 
Configure bugmail: https://www.rtems.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the bugs mailing list