1. 程式人生 > >linux核心細節 va_arg 錯誤(崩潰)

linux核心細節 va_arg 錯誤(崩潰)

  最近做windows至linux遷移,碰到一個linux核心的問題,         

#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))

#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))

#define va_end(ap) (ap = (va_list) NULL)

#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND)))

此些語句每次做一定的偏移,沒有型別的限制,而我們每次在va_list讀了一個WORD,而linux核中是無法區別 int 位元組寬度以下的

(也是從別的文件中得知),因些每次讀一個int再將其內容強制轉化為WORD,像BYTE同樣轉化,此時問題得到解決。具體情況見 鴨蛋西紅柿 的C部落格。

本人系統為centos 64..