2011-04-13 217 views
1

我正在尋找「壞/破」的C代碼,我可以使用測試基於單片機的系統上的錯誤處理程序。不良C代碼來測試錯誤處理程序

我正在尋找在運行時會中斷的代碼。

因此,發瘋了,你的揹包裏有哪些小代碼可以用來破壞系統。並且應該由錯誤處理程序處理以避免不受控制的行爲。

/感謝


我將與一對夫婦的例子開始。

寫一個空指針

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

值寫入指針是unvalid

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

跳轉到一個unvalid函數指針

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

那麼你有一些更糟糕的事情,你可以拋出一個錯誤處理程序?

+0

是否錯誤處理程序不來與排序文件的那描述了它可以處理哪些類型的錯誤? – 2011-04-13 20:18:52

+1

可能的重複[使C++崩潰而不投射?](http://stackoverflow.com/questions/5556183/make-c-crash-without-casting) – MByD 2011-04-13 20:19:50

+1

@Oli這是供將來參考,我想我會寫一個爲一個特定的系統。因爲我現在是一個TTD傢伙。我收集的東西,我可以測試這個錯誤處理程序。所以這是明天,但看到所有令人討厭的答案也很有趣。 – Johan 2011-04-13 20:38:05

回答

2

除以零(和簡單的數學在它獲得的情況下,編譯器試圖優化它拿走):

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

嘗試訪問一個高的內存地址,以及較低的一個:

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

如果你有一個堆MGMT庫,嘗試釋放兩次:

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

嘗試不ABA分配內存NDON:

for(;;) 
    malloc(4096); 

嘗試以排出堆:

int foo(int arg) { return foo(arg+1); } 
int main(int a, char *v[]) { return foo(1); } 
+0

div by zero,classic :) – Johan 2011-04-13 20:17:42

1

寫過去一個緩衝區的末尾:

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

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

這相當於寫入無效指針。 – 2011-04-13 20:19:33

+1

好吧,如果你倒退(或前進在拱門上)只需幾步就可以摧毀像堆棧指針這樣的東西,然後當我們試圖從這個函數返回時,我們有另一個有趣的bug ... – Johan 2011-04-13 20:57:00

2
int f() { return f() + f(); } 
int g() { return g(); } 
int h() { while(1); } 
+0

最後一個isn'不一定是錯誤。 – 2011-04-13 20:22:58

+0

@oli - 你是對的,但是OP的要求有些模糊。 「壞/壞C代碼」涵蓋了相當廣泛的範圍。 – 2011-04-13 20:29:08

+0

但f()和g()是很好的測試:) – Johan 2011-04-13 20:32:09

2

通過相互遞歸排出棧(可能難以檢測):

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