Why electric fence/Valgrind is unable to catch this buffer-overflow issue?

前端 未结 5 2044
忘掉有多难
忘掉有多难 2021-02-10 16:11

I have created a buggy program - buggy.c - this is a buffer-overflow scenario for buffer t. You can see that I am writing more than 5 indexes. It works fine. It never throws me

5条回答
  •  梦如初夏
    2021-02-10 16:48

    Valgrind is limited by having only the binary available. If you don't mind some instrumentation being inserted in your code (by compiler), you can try address sanitizer. It poisons memory around allocated areas (even on stack) and then checks every read/write, so it has higher chance to catch these problems.

    It's integrated in current gcc (4.8+) and clang (3.2+) Just compile your code like:

    gcc -g buggy.c  -o buggy.out -fsanitize=address
    

    Upon execution, it prints something like:

    ==26247== ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff9fa0be54 at pc 0x4008df bp 0x7fff9fa0be00 sp 0x7fff9fa0bdf8
    WRITE of size 4 at 0x7fff9fa0be54 thread T0
    

    and a stack trace.

    Chandler Carruth talked about it in this talk at GN13

    Note: It is supported even in clang 3.1, but the switch is called -faddress-sanitizer instead of -fsanitize=address.

提交回复
热议问题