Поблочное тестирование на неудавшийся malloc ()

WPF Textblock наследовался от FrameworkElement вместо того, чтобы произойти от Система. Windows. Управление как Элемент управления "метка". Это означает, что Textblock намного более легок. Оборотная сторона использования textblock не является никакой поддержкой Ключей Access/Accerelator и нет никакой ссылки на другие средства управления как цель.

, Когда Вы хотите отобразить текст отдельно, используют TextBlock. Преимущество является легким, производительным способом отобразить текст.

, Когда Вы хотите связать текст с другим управлением как TextBox, используют Элемент управления "метка" . Преимущества являются ключами доступа и ссылками для предназначения для управления.

8
задан Roman Nikitchenko 18 February 2015 в 01:12
поделиться

6 ответов

Я увидел классное решение этой проблемы, которое мне предложил С. Пааволайнен. Идея состоит в том, чтобы переопределить стандартный malloc () , который вы можете сделать только в компоновщике, с помощью специального распределителя, который

  1. считывает текущий стек выполнения потока, вызывающего malloc ()
  2. проверяет, существует ли стек в базе данных, которая хранится на жестком диске.
    1. , если стек не существует, добавляет стек в базу данных и возвращает NULL
    2. , если стек уже существует, обычно выделяет память и возвращает

Затем вы просто запускаете свой модульный тест много раз: эта система автоматически перебирает различные пути управления до отказа malloc () и намного более эффективна и надежна, чем, например, случайное тестирование.

16
ответ дан 5 December 2019 в 07:11
поделиться

напишите свою собственную библиотеку, которая реализует malloc путем случайного сбоя или вызова реального malloc (либо статически связанного, либо явного dlopen)

, затем LD_PRELOAD it

2
ответ дан 5 December 2019 в 07:11
поделиться

Я предлагаю создать специальную функцию для вашего специального кода malloc, который, как вы ожидаете, может дать сбой и с которым можно будет аккуратно справиться. Например:

void* special_malloc(size_t bytes) {
  void* ptr = malloc(bytes);
  if(ptr == NULL) {
    /* Do something crafty */
  } else {
    return ptr;
  }
}

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

2
ответ дан 5 December 2019 в 07:11
поделиться

Это довольно грубо, но если вы действительно хотите модульное тестирование, вы можете сделать это с помощью #ifdefs:

thingy *my_thingy = malloc(sizeof(thingy));
#ifdef MALLOC_UNIT_TEST_1
my_thingy = NULL;
#endif
if (my_thingy == NULL) {
  fprintf(stderr, "We're so screwed!\n");
  exit(EXIT_FAILURE);
}

К сожалению, вам придется много перекомпилировать с этим решением.

Если вы используете Linux, вы можете также можно рассмотреть возможность запуска кода при нехватке памяти, используя ulimit , но будьте осторожны.

1
ответ дан 5 December 2019 в 07:11
поделиться

Во FreeBSD я однажды просто перегрузил модуль malloc.o библиотеки C (символы там были слабыми) и заменил реализацию malloc () на реализацию с контролируемой вероятностью сбоя. Итак, я подключился статически и начал проводить тестирование. srandom () завершил изображение с помощью управляемой псевдослучайной последовательности.

Также посмотрите здесь , чтобы найти набор хороших инструментов, которые, по моему мнению, вам нужны. По крайней мере, они перегружают malloc () / free () для отслеживания утечек, поэтому кажется полезным добавить все, что вы хотите.

1
ответ дан 5 December 2019 в 07:11
поделиться

Вы можете захватить malloc, используя некоторые определения и глобальные параметры для управления им ... Это немного хакерское занятие, но, похоже, работает.

#include <stdio.h>
#include <stdlib.h>

#define malloc(x) fake_malloc(x)

struct {
  size_t last_request;
  int should_fail;
  void *(*real_malloc)(size_t);
} fake_malloc_params;

void *fake_malloc(size_t size) {
  fake_malloc_params.last_request = size;
  if (fake_malloc_params.should_fail) {
    return NULL;
  }
  return (fake_malloc_params.real_malloc)(size);;
}

int main(void) {
  fake_malloc_params.real_malloc = malloc;
  void *ptr = NULL;
  ptr = malloc(1);
  printf("last: %d\n", (int) fake_malloc_params.last_request);
  printf("ptr: 0x%p\n", ptr);
  return 0;
}
1
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: