How to troubleshoot crashes in malloc

后端 未结 3 678
孤街浪徒
孤街浪徒 2020-12-12 05:32

I have a large body of legacy code that I inherited. It has worked fine until now. Suddenly at a customer trial that I cannot reproduce inhouse, it crashes in malloc. I thin

相关标签:
3条回答
  • 2020-12-12 05:43

    Try Asan

    AddressSanitizer (aka ASan) is a memory error detector for C/C++. It finds:

    Use after free (dangling pointer dereference)
    Heap buffer overflow
    Stack buffer overflow
    Global buffer overflow
    Use after return
    Use after scope
    Initialization order bugs
    Memory leaks
    

    Please find the links to know more and how to use it

    https://github.com/google/sanitizers/wiki/AddressSanitizer and https://github.com/google/sanitizers/wiki/AddressSanitizerFlags

    0 讨论(0)
  • 2020-12-12 05:52

    I know this is old, but issues like this will continue to exist as long as we have pointers. Although valgrind is the best tool for this purpose, it has a steep learning curve and often the results are too intimidating to understand.

    Assuming you are working on some *nux, another tool I can suggest is electricfence. Quote:

    Electric Fence helps you detect two common programming bugs:

    software that overruns the boundaries of a malloc() memory allocation,
    software that touches a memory allocation that has been released by free().
    Unlike other malloc() debuggers, Electric Fence will detect read accesses
    as well as writes, and it will pinpoint the exact instruction that causes
    an error.
    

    Usage is amazingly simple. Just link your code with an additional library lefence When you run the application, a corefile will be generated when memory is corrupted, instead of when corrupted memory is used.

    0 讨论(0)
  • 2020-12-12 06:04

    Is memory allocation broken?

    Try valgrind.

    Malloc is still crashing.

    Okay, I'm going to have to assume that you mean SIGSEGV (segmentation fault) is firing in malloc. This is usually caused by heap corruption. Heap corruption, that itself does not cause a segmentation fault, is usually the result of an array access outside of the array's bounds. This is usually nowhere near the point where you call malloc.

    malloc stores a small header of information "in front of" the memory block that it returns to you. This information usually contains the size of the block and a pointer to the next block. Needless to say, changing either of these will cause problems. Usually, the next-block pointer is changed to an invalid address, and the next time malloc is called, it eventually dereferences the bad pointer and segmentation faults. Or it doesn't and starts interpreting random memory as part of the heap. Eventually its luck runs out.

    Note that free can have the same thing happen, if the block being released or the free block list is messed up.

    How you catch this kind of error depends entirely on how you access the memory that malloc returns. A malloc of a single struct usually isn't a problem; it's malloc of arrays that usually gets you. Using a negative (-1 or -2) index will usually give you the block header for your current block, and indexing past the array end can give you the header of the next block. Both are valid memory locations, so there will be no segmentation fault.

    So the first thing to try is range checking. You mention that this appeared at the customer's site; maybe it's because the data set they are working with is much larger, or that the input data is corrupt (e.g. it says to allocate 100 elements and then initializes 101), or they are performing things in a different order (which hides the bug in your in-house testing), or doing something you haven't tested. It's hard to say without more specifics. You should consider writing something to sanity check your input data.

    0 讨论(0)
提交回复
热议问题