2017-05-06 35 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的来源。 –

相关问题