Будет ли Insure ++ обнаруживать переполнение массива в структуре C в куче? - PullRequest
1 голос
/ 29 декабря 2011

Я пытался найти лучшие программы для обнаружения переполнения буфера в C-программе.В частности, я хочу обнаружить переполнения массива char, который существует в структуре C в куче.

Например:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
    struct mystruct
    {
        char fill[4];
        char g[4];
        char h[4];
    };

    /* A structure on the heap */
    struct mystruct *strheap =
       (struct mystruct *) malloc(sizeof(struct mystruct));

    memset(strheap, 0, sizeof(struct mystruct));

    printf("Before overrun array but not structure\n");
    sprintf(strheap->fill, "12345678901");

    printf("Before overrun array and structure but only by 1 byte\n");
    sprintf(strheap->g, "12345678");

    printf("Before free\n");
    free(strheap);
    printf("Before return\n");
    return 0;
}

Может ли Insure ++ обнаружить два переполнения массива в этой тестовой программе?

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

Из опыта да. При условии, что вы на самом деле переполняете массив (один или два элемента после конца), а не разыменовываете дикую разметку через конец.

Ой, подождите, я неправильно понял вопрос, подумал, что вы спрашиваете о массивах структур.

В вашем случае, я думаю, что он обнаружит, если вы обращаетесь к индексу за пределами границ, но переполнение следующего члена внутри функции библиотеки не будет обнаружено (дополнительные инструменты для индексации не произойдут). Только если библиотечная функция записывает за пределы объекта (всей структуры или, возможно, даже структуры / массива, содержащего структуру), может быть обнаружено переполнение буфера библиотечной функции.

С одной стороны, вполне законно и разумно

sizeof mystruct one, two;
memcpy(&one, &two, sizeof (struct mystruct));

, который копирует все четыре массива. Insure ++ не собирается это отмечать.

И на самом деле, memset в вашем вопросе делает то же самое.

0 голосов
/ 13 июня 2013

В настоящее время я проверяю страховки, чтобы я мог проверить вашу программу. Журнал ниже генерируется во время выполнения после компиляции и компоновки main.c со страховкой:

[main.c] (Thread 0) **WRITE_OVERFLOW**
>> #include "stdio.h"

  Writing overflows memory: strheap->g

          bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
          |     4     |          8           | 1 |
                      wwwwwwwwwwwwwwwwwwwwwwwwwwww

   Writing  (w) : 0x3002247c thru 0x30022484 (9 bytes)
   To block (b) : 0x30022478 thru 0x30022483 (12 bytes)
                 strheap, allocated in main.c
                          malloc()  (interface)
                            main()  main.c

  Stack trace where the error occurred:
                            main()  main.c

**Memory corrupted.  Program may crash!!**

[main.c] (Thread 0) **HEAP_CORRUPT**
>> #include "stdio.h"

  The heap is corrupt.

          bbbbbb
          | 12 | 16  |
               xgggggg

  Guardzone      : 0x30022484 thru 0x30022493 (16 bytes)
  Expected   (g) : fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  Found      (x) : 00 fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
                   .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

  Near Block (b) : 0x30022478 thru 0x30022483 (12 bytes)
                  strheap, allocated in main.c
                          malloc()  (interface)
                            main()  main.c

stack trace where memory was freed:
                            free()  (interface)
                            main()  main.c

  Stack trace where error was detected:
                            free()  (interface)
                            main()  main.c

** TCA log data will be merged with tca.log **
************************* INSURE SUMMARY ************************ v7.4.3 **
*   Program      : a.out                                                  *
*   Arguments    :                                                        *
*   Directory    : ~/test/stackoverflow                  *
*   Compiled on  : Jun 13, 2013  07:59:47                                 *
*   Run on       : Jun 13, 2013  07:59:54                                 *
*   Elapsed time : 00:00:00                                               *
*   Malloc HWM   : 48649 bytes (47K)                                      *
***************************************************************************

PROBLEM SUMMARY - by type
===============

          Problem                Reported      Suppressed
          -------------------------------------------------
          HEAP_CORRUPT                 1                0
          WRITE_OVERFLOW               1                0
          -------------------------------------------------
          TOTAL                        2                0
          -------------------------------------------------

PROBLEM SUMMARY - by location
===============

HEAP_CORRUPT: The heap is corrupt, 1 unique occurrence
         1 in main.c

WRITE_OVERFLOW: Writing overflows memory, 1 unique occurrence
         1 in main.c
0 голосов
/ 29 декабря 2011

Наш инструмент CheckPointer найдет доступ вне структуры members независимо от того, где существует структура. В частности, он также обнаружит ошибки в доступе к переменным, которые выделены стеком или потоком (valgrind не сделает этого).

В вашем примере ваш код напрямую не фиксирует ошибку доступа; вы выдвинули (скрыли) проблему в вызове sprintf. CheckPointer тоже найдет это. Он использует библиотеку замен для стандартных библиотечных вызовов, которые включают такую ​​проверку. Он не обнаружит неправильный доступ с помощью таких операций, как memset или memcpy.

Вы можете скачать версию, которая сможет сделать ваш пример напрямую.

[CheckPointer доступен для C, но еще не для C ++.]

...