2016-12-04 52 views
1

我有一個遺留的c項目與許多類型轉換和鑄件。通常檢查溢出動態行爲,gcc(和C朗)定義了一個內置函數:使用gcc捕獲類型轉換溢出

內置函數:布爾__builtin_add_overflow(TYPE1一個,2型B,類型3 * RES)

如果結果溢出,則函數返回true。然後我的計劃可能會抓住這種情況並採取相應的行動

爲了在不更改任何遺留代碼的情況下具有相同的功能,是否可以指示gcc使用此類內置函數並調用提供的函數作爲捕獲器(如果內置函數返回true)?我希望我能找到的東西,如:

無效_cyg_add_overflow_catcher(A,B,__FILELINE);

GCC已經可以instrument functions,爲了追蹤和分析,所以這個概念並不奇怪。 任何想法?

+1

有沒有可能簡單地使用[UBSan](http://developers.redhat.com/blog/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan)? – yugr

回答

2

這些函數被GCC降低爲有效的asm序列,所以它們不存在於最終目標代碼中。另一方面,在UBSan mode中編譯時,GCC將在溢出時調用libubsan.so中的專用回調。你可以在你的可執行文件中覆蓋這些回調,並進行必要的處理(這當然很不好)。

請注意,GCC只跟蹤簽署的數字的溢出,因爲無符號溢出由標準定義。

+0

我不瞭解UBSan,完全符合我的需求。但是它將如何報告一個裸機的實現? –

+1

「但是它會如何報告一個裸機的c實現」 - 你的意思是你想檢測bootloader等裸機程序中的溢出嗎?在這種情況下,您需要自己提供UBSan回調的實現,並將其鏈接到您的應用中。這已經在[Linux內核](https://kernel.org/doc/html/latest/dev-tools/ubsan.html)中完成了,所以這是可能的。 – yugr