2017-05-06 20 views
0

當鏈接到pthreads時,我在程序執行期間收到意外的行爲,ncurses接口變得沒有響應,但程序不會崩潰。這是沒有使用任何pthread功能,沒有線程頭或任何與線程相關的東西,只是連接。鏈接到pthreads的原因會導致程序行爲發生變化?

鏈接到庫的任何原因是否可以在不發出警告的情況下更改程序行爲?

相關信息:

  • 的ncurses也與可執行文件。
  • 一切都在命名空間中。
  • 嘗試使用當前的gcc和clang。
  • 沒有編譯器/鏈接器錯誤或警告使用-Wall。
  • Arch Linux。

將ncurses和pthread連接在一起可以在我製作的一個較小的測試程序上正常工作。所以我在尋找更多的地方看看,這是一個庫項目,代碼庫是一個很好的大小,除了使用ncurses庫的一個小組件外,它都是普通的C++ 14。

+3

最有可能你只是在你的代碼中有一些錯誤,pthreads是不相關的。或者你有與pthreads符號名稱衝突。但是由於您沒有提供[最小化,完整和可驗證示例](http://stackoverflow.com/help/mcve),因此無法猜測。你甚至沒有定義什麼「意外行爲」。 – VTT

+0

這裏沒有傳感器......如果你沒有提供說明行爲和變化的代碼,沒有人能夠提供幫助。最有可能你的代碼包含UB – Swift

+0

代碼庫很大,我真的不知道錯誤來自哪裏,意外的行爲是ncurses接口沒有響應,沒有崩潰。我擁有名稱空間中的所有內容,並且沒有符號名稱衝突警告/錯誤。 –

回答

1

如果在代碼中沒有更改什麼,甚至沒有包含頭文件,但行爲已更改,那麼您的項目包含UB。在標準中定義的可能瑞銀,可能導致此:

  • 定義任何功能或包含在標準頭
  • std命名空間中定義的東西的人的名字相匹配的全局變量。
  • 使用舊C標準頭文件與新C++頭文件混合使用
  • 使用未定值初始化的變量。
  • 數組綁定破壞,不依賴於頁面錯誤或其他類型的災難性結果,可能會導致程序更改行爲。
  • 非法使用操作員的副作用,例如:a ^=b ^= a ^=b;

等等。

我建議檢查警告,不僅是錯誤。有一些警告實際上是語義錯誤或UB的跡象。至少對於GCC來說。許多新手程序員只是忽視警告是非必要的。例如。這種方式經常潛入:

const char a = 167; 

if(a == 167) // compiler makes warning here, a ==-89 in this example 
{ 
    // code will never be executed or even compiled 
} 

該代碼編譯但並沒有以預期的方式執行。

+0

*「定義任何匹配標準頭文件中的任何函數或全局變量」* - 「匹配」是什麼意思? *「使用舊的C標準頭文件與新的C++頭文件混合」* - 這與UB有什麼關係? *「次要數組綁定破壞,不依賴於頁面錯誤」* - 它不需要很小就是UB,並且不需要導致頁面錯誤。 *「編譯器在這裏發出警告」* - 不,不在這裏,而是在初始化時。 –

+0

@Christian Hackl按名稱匹配。說明了這一點。他們a)被列爲可能導致程序B的UB的行爲)我遇到了問題(並且在SO上有一些這樣的例子),我同意數組綁定問題,這只是最常見的結果。 GCC只有在處於迂迴模式時纔會發出警告。大多數編譯器根本就不會對該分配發出警告,因爲這種分配的結果已被定義,所以這不是必需的。編譯器發出警告,因爲a)比較可能會導致意外的結果b)在常量變量的情況下,整個代碼分支將被截斷。即使在這種情況下,並非所有的編譯器都這樣做,例如MSVC – Swift

+0

@Swift當你說使用舊的標準頭文件時,是否包含舊的C頭文件的C++版本,例如?感謝您的迴應,我們將尋找UB的來源。 –

相關問題