如何讓GCC檢查類printf函式的引數

2021-06-20 05:28:45 字數 1262 閱讀 9510

來篇又短又水的。

大家都知道在c語言中有一類可變引數(variable-argument)的函式,像printf、scanf,這類函式的一大優勢是輸入引數的數量和型別都可以自由控制,但是問題也很明顯,如果可變引數輸入的個數或者型別不對,正常情況下編譯器檢查不出這樣的錯誤,而實際執行卻可能破壞堆疊,導致一些古怪的執行結果,很難定位到問題。

gcc中使用__attribute__format 可以解決這個問題。該__attribute__屬性可以給被宣告的函式加上類似printf或者scanf的特徵,從而使編譯器檢查函式宣告和函式實際呼叫引數之間的格式化字串是否匹配。該功能十分有用,尤其是處理一些很難發現的bug。

format的語法格式為:

format (archetype, string-index, first-to-check)

format屬性告訴編譯器,按照printf, scanf,

strftime或strfmon的引數**式規則對該函式的引數進行檢查。「archetype」指定是哪種風格;「string-index」指定傳入函式的第幾個引數是格式化字串;「first-to-check」指定從函式的第幾個引數開始按上述規則進行檢查。

具體使用格式如下:

__attribute__((format(printf,m,n)))

__attribute__((format(scanf,m,n)))

其中引數m與n的含義為:

m:第幾個引數為格式化字串(format string);

n:引數集合中的第乙個,即引數「…」裡的第乙個引數在函式引數總數排在第幾,注意,如果是在類成員函式中使用,還要考慮到隱藏的this指標。

舉個例子:

1:2:extern void myprint(const char *format,…)

__attribute__((format(printf,1,2)));

3:4:void test()

5:執行$gcc –wall –c attribute.c attribute後,輸出結果為:

attribute.c: in function `test』:

attribute.c:7: warning: format argument is not a pointer (arg 2)

attribute.c:9: warning: format argument is not a pointer (arg 2)

attribute.c:9: warning: too few arguments for format

原文見:

如何讓類不能被繼承

方法一 借助 final 關鍵字,用該關鍵字修飾的類不能被繼承。include using namespace std class base final class derive public base int main 解決方法二 借助友元 虛繼承和私有建構函式來實現 include using ...

python如何讓類支援比較運算

案例 有時我們希望自定義的類,例項間可以使用比較運算子進行比較,我們自定義比較的行為。需求 有乙個矩形的類,我們希望比較兩個矩形的例項時,比較的是他們的面積 如何解決這個問題?在類中重新定義比較運算子,所有的比較運算可以簡化為兩個基本的比較運算,小於和等於比較 單個模擬較 usr bin pytho...

c c 中如何讓指定類不能被繼承?

有時候我們並不希望自己寫的類被繼承,怎麼做呢?方法很簡單,只需要在定義類時加上sealed關鍵字,用 sealed 關鍵字宣告的類也叫密封類,如下 public sealed class room 強制派生會有什麼錯誤呢?如下截圖 room 被定義為密封類,因此現在已經無法從 room 類派生。如果...