2

編寫一個函數回調函數庫,我經常對具有相同調用約定和相同簽名的類型進行類型化(和調用)函數指針,但有一個例外:它們具有參數指向到不同類型(所有數據)或無效指針。C函數指針類型兼容性

最近,我發現它可能不是安全的,根據這個:https://stackoverflow.com/a/14044244/3079266

基本上,我的理解是,如果參數類型是兼容的,這意味着該函數指針類型也兼容,應該沒有問題。

現在,我有3個問題。

第一:這是否意味着,由於指向不同類型的指針在技術上是不兼容的,我所做的操作會導致未定義的行爲?

第二:我可以在哪裏(在哪些架構上)擺脫它?它們之間是Windows x86還是x64版本?

第三:我在哪裏不能擺脫它?

+0

@iharob但你傳遞給這些函數的函數指針*必須帶有'void'指針或者你有未定義的行爲。在函數內部投射指針是可以的,但參數應該如指定的那樣。 –

+4

第一個問題:是的。第二個問題:到處。第三個問題:沒有任何地方(除了當你回答這個問題時,這裏的人們喜歡UB,如果你沒有在需要的時候提及它,就會投票給你)。 –

+0

@barakmanos:所以,我可能只是警告用戶,_technically_,這可能會導致UB,但實際上不會?謝謝! =) – Mints97

回答

2
  1. 是的,這是UB本身
  2. 你也許可以逃脫這種非優化的非調試版本。優化器可以利用指針類型來判斷兩個指針是否可以被別名,如果你說謊的是實際類型,那麼邏輯可能會失敗。調試版本當然可以直接檢查是否存在類型不匹配。
  3. Windows不是一個編譯器,所以這不是一個明智的問題。通用Windows編譯器可以優化構建,而且ICC尤其被稱爲具有高級優化。