2015-04-23 19 views
9

我想從開源庫中使用函數。這個函數默認不暴露在外(所以我假設它不是直接由開源庫提供的效用函數),但是我需要這個函數來解決我代碼中的一些問題,所以不知何故,我在makefile中做了一些更改以公開來自圖書館的功能。如何找到函數是否可重入

現在的問題是如何確保這個功能是可重入的。

我無法用肉眼發現,因爲它在內部調用一些函數。

準確地說,我很想知道是否有任何可用的工具或GDB中的任何選項來檢查我的函數是否僅使用局部變量並且它不會更改全局變量。

+6

如果不確定並且您可以修改(看起來您是),請使用某些靜態互斥鎖使該函數不可重入。 –

+1

你可以檢查disassembled代碼。儘管... –

+0

您可能只需調用該函數,然後調用一箇中斷並再次調用該函數並查看會發生什麼。如果表現不好。 –

回答

1

確定函數是否可重入的方法是分析它的功能。

1)它不訪問全局變量,除非對這些全局變量的操作是原子操作(例如,沒有辦法同時讀取和修改全局變量)。這通常意味着避免使用全局變量,或者保證同步訪問它們 - 例如所有修改和讀取全局的代碼在完成之前都會持有一個互斥鎖,因此這些操作將被序列化。或代碼th

2)代碼不是自我修改的(幸運的是,自修改代碼在標準C或C++中相對較少)。 3)它不會調用其他不是可重入函數(包括標準庫中相當數量的函數)或程序(例如,多處理通常會使需要確保重入的控制複雜化)的其他函數調用。

我不知道任何特定的工具來分析函數來確定重入。通常一個函數被設計爲可重入(或不可重入)。在實踐中,如果沒有文檔說某個函數被設計爲可重入的,那麼這是公平的,它不是可重入的。