Плохой C-код для проверки обработчика ошибок - PullRequest
1 голос
/ 14 апреля 2011

Я ищу "плохой / неработающий" код c, который можно использовать для проверки обработчика ошибок в системе, основанной на mcu.

Я ищу код, который сломается во время выполнения.

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

/ Спасибо


Начну с пары примеров.

Запись в нулевой указатель

int* pointer = 0x0;
*pointer = 0xBAADC0DE;

Запись недопустимого указателя

int* pointer = 0xCAFEBABE;
*pointer = 0xDEADBEEF;

Перейти к недопустимому указателю на функцию

int (*fpBabe)() = 0xDEADBABE;
fpBabe();

Итак, есть ли у вас еще какие-нибудь плохие вещи, которые вы можете добавить в обработчик ошибок?

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

Исчерпать стек с помощью взаимной рекурсии (может быть сложнее обнаружить):

int f(void) { return g(); }
int g(void) { return f(); }
int main(void) { return f(); }

... или с помощью забавной обработки сигнала:

void handler(int n) { raise(n); raise(n); }
int main(void) { signal(SIGINT, &handler); raise(SIGINT); return 0; }

Уничтожить кучу:

for (char *x = malloc(1); *x++ = 42;);

Уничтожить кучу и обвинять бесплатно ():

char *x = malloc(1);
for (int i = 0; i < 100; x[i++] = 42);
free(x);   // free() will probably segfault
2 голосов
/ 14 апреля 2011
int f() { return f() + f(); }
int g() { return g(); }
int h() { while(1); }
2 голосов
/ 14 апреля 2011

Деление на ноль (и простая математика, чтобы получить его в случае, если компилятор попытается оптимизировать его):

int i = argc;
return 34/(argc-i);

Попробуйте получить доступ как к старому адресу памяти, так и к низкому:

char *v = ~0;
*v = '\0';

Если у вас есть библиотека mgmt кучи, попробуйте освободить дважды:

char *ptr = malloc(4096);
free(ptr); free(ptr);

Попробуйте выделить память без остатка:

for(;;)
    malloc(4096);

Попробуйте исчерпать стек:

int foo(int arg) { return foo(arg+1); }
int main(int a, char *v[]) { return foo(1); }
1 голос
/ 14 апреля 2011

Запись за концом буфера:

 char dest[5];
 const char* src = "a bigger source";
 strcpy(dest,src);

или

 dest[5]='\0';
...