WPF Textblock наследовался от FrameworkElement вместо того, чтобы произойти от Система. Windows. Управление как Элемент управления "метка". Это означает, что Textblock намного более легок. Оборотная сторона использования textblock не является никакой поддержкой Ключей Access/Accerelator и нет никакой ссылки на другие средства управления как цель.
, Когда Вы хотите отобразить текст отдельно, используют TextBlock. Преимущество является легким, производительным способом отобразить текст.
, Когда Вы хотите связать текст с другим управлением как TextBox, используют Элемент управления "метка" . Преимущества являются ключами доступа и ссылками для предназначения для управления.
Я увидел классное решение этой проблемы, которое мне предложил С. Пааволайнен. Идея состоит в том, чтобы переопределить стандартный malloc ()
, который вы можете сделать только в компоновщике, с помощью специального распределителя, который
malloc ()
NULL
Затем вы просто запускаете свой модульный тест много раз: эта система автоматически перебирает различные пути управления до отказа malloc ()
и намного более эффективна и надежна, чем, например, случайное тестирование.
напишите свою собственную библиотеку, которая реализует malloc путем случайного сбоя или вызова реального malloc (либо статически связанного, либо явного dlopen)
, затем LD_PRELOAD it
Я предлагаю создать специальную функцию для вашего специального кода malloc, который, как вы ожидаете, может дать сбой и с которым можно будет аккуратно справиться. Например:
void* special_malloc(size_t bytes) {
void* ptr = malloc(bytes);
if(ptr == NULL) {
/* Do something crafty */
} else {
return ptr;
}
}
Тогда вы можете провести здесь модульное тестирование этого хитрого бизнеса, передав некоторые неверные значения для байтов. Вы можете поместить это в отдельную библиотеку и создать фиктивную библиотеку, которая ведет себя специально для вашего тестирования функций, которые ее вызывают.
Это довольно грубо, но если вы действительно хотите модульное тестирование, вы можете сделать это с помощью #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 , но будьте осторожны.
Во FreeBSD я однажды просто перегрузил модуль malloc.o библиотеки C (символы там были слабыми) и заменил реализацию malloc () на реализацию с контролируемой вероятностью сбоя. Итак, я подключился статически и начал проводить тестирование. srandom () завершил изображение с помощью управляемой псевдослучайной последовательности.
Также посмотрите здесь , чтобы найти набор хороших инструментов, которые, по моему мнению, вам нужны. По крайней мере, они перегружают malloc () / free () для отслеживания утечек, поэтому кажется полезным добавить все, что вы хотите.
Вы можете захватить 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;
}