user-0 提问: 一个奇怪的bug

回复:
user: user-0
content: 引用 14 楼 zhujinqiang 的回复:断点下在0 & 1那行试试看。  结果一样的呀。

user: user-1
content: 断点下在0 & 1那行试试看。

user: user-0
content: 引用 12 楼 paschen 的回复:[quote=引用 8 楼 lxr5109 的回复:] [quote=引用 2 楼 paschen 的回复:] 0 & 1的结果肯定是0  看你断点断在哪了，或者看汇编，一般来说是编译器BUG的可能性很小  断点段在aaa = g_ArcDigitalInput.m_ArcDigitalIO & i; 这一行。 aaa是我测试的代码，原来的代码是给一个函数的输入参数赋值，就是上面注释的那行，也是一样的问题。还有一个比较有趣的是，这问题在Debug版本执行有问题，而release版本却没有问题。 原来的函数接口是：ERROR_ID ArcDIRead(__IN ARCDISIGNAL diindex, __OUT int *disignal) 这部分执行的代码是 	i = 1; 	i = i << diindex;     pthread_mutex_lock(&g_Mutex_ArcWeldingBasic);      if (g_ArcIOModule.m_Used > 0)     {         *disignal = g_ArcDigitalInput.m_ArcDigitalIO & i;     }  debug的部分汇编：       65:	c7 45 f4 01 00 00 00 	movl   $0x1,-0xc(%ebp)       6c:	8b 45 08             	mov    0x8(%ebp),%eax       6f:	89 c1                	mov    %eax,%ecx       71:	d3 65 f4             	shll   %cl,-0xc(%ebp)       74:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)       7b:	e8 fc ff ff ff       	call   7c <ArcDIRead+0x7c>       80:	a1 00 00 00 00       	mov    0x0,%eax       85:	85 c0                	test   %eax,%eax       87:	7e 11                	jle    9a <ArcDIRead+0x9a>  release的部分汇编：     1d94:	b8 01 00 00 00       	mov    $0x1,%eax     1d99:	89 f1                	mov    %esi,%ecx     1d9b:	d3 e0                	shl    %cl,%eax     1d9d:	23 05 04 00 00 00    	and    0x4,%eax     1da3:	89 03                	mov    %eax,(%ebx)     1da5:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)     1dac:	e8 fc ff ff ff       	call   1dad <ArcDIRead+0x4d>  我不知道贴这么些汇编试否能够说明问题？谢谢 [/quote]  你要断在下一行，断在这行的时候，这行的代码是还没有执行的[/quote]  嗯，我是断在这行，然后单步执行这行，然后再贴的结果，和断在下一行结果应该是一样的。

user: user-2
content: 引用 8 楼 lxr5109 的回复:[quote=引用 2 楼 paschen 的回复:] 0 & 1的结果肯定是0  看你断点断在哪了，或者看汇编，一般来说是编译器BUG的可能性很小  断点段在aaa = g_ArcDigitalInput.m_ArcDigitalIO & i; 这一行。 aaa是我测试的代码，原来的代码是给一个函数的输入参数赋值，就是上面注释的那行，也是一样的问题。还有一个比较有趣的是，这问题在Debug版本执行有问题，而release版本却没有问题。 原来的函数接口是：ERROR_ID ArcDIRead(__IN ARCDISIGNAL diindex, __OUT int *disignal) 这部分执行的代码是 	i = 1; 	i = i << diindex;     pthread_mutex_lock(&g_Mutex_ArcWeldingBasic);      if (g_ArcIOModule.m_Used > 0)     {         *disignal = g_ArcDigitalInput.m_ArcDigitalIO & i;     }  debug的部分汇编：       65:	c7 45 f4 01 00 00 00 	movl   $0x1,-0xc(%ebp)       6c:	8b 45 08             	mov    0x8(%ebp),%eax       6f:	89 c1                	mov    %eax,%ecx       71:	d3 65 f4             	shll   %cl,-0xc(%ebp)       74:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)       7b:	e8 fc ff ff ff       	call   7c <ArcDIRead+0x7c>       80:	a1 00 00 00 00       	mov    0x0,%eax       85:	85 c0                	test   %eax,%eax       87:	7e 11                	jle    9a <ArcDIRead+0x9a>  release的部分汇编：     1d94:	b8 01 00 00 00       	mov    $0x1,%eax     1d99:	89 f1                	mov    %esi,%ecx     1d9b:	d3 e0                	shl    %cl,%eax     1d9d:	23 05 04 00 00 00    	and    0x4,%eax     1da3:	89 03                	mov    %eax,(%ebx)     1da5:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)     1dac:	e8 fc ff ff ff       	call   1dad <ArcDIRead+0x4d>  我不知道贴这么些汇编试否能够说明问题？谢谢 [/quote]  你要断在下一行，断在这行的时候，这行的代码是还没有执行的

user: user-3
content: 你用日志输出每个地方的aaa值看看。  引用 6 楼 lxr5109 的回复:[quote=引用 1 楼 turingo 的回复:] 从你的图片上来看，那个1不像是1更像是字母i，你看看是不是打错了。  [quote=引用 楼主 lxr5109 的回复:] C程序，aaa、g_ArcDigitalInput.m_ArcDigitalIO和i都是unsigned int。 然后执行：aaa = g_ArcDigitalInput.m_ArcDigitalIO & i; 其中g_ArcDigitalInput.m_ArcDigitalIO = 0，i= 1。结果aaa居然等于1…… 其中g_ArcDigitalInput.m_ArcDigitalIO是全局变量，aaa和i都是局部变量。但是这段代 码被mutex保护了。 截图是这一句的执行结果    但后一句aaa = 0 & 1;结果又是正常的，aaa等于0[/quote]  是字母i，这个时候i就等于1[/quote]

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:建议将该函数的代码贴出来，同时与aaa有关的变量，可以先打印出来，这样缩小判定的范围。  aaa是测试代码，上面就一个unsigned int aaa=0;

user: user-0
content: 引用 3 楼 zhujinqiang 的回复:局部变量先进行初始化 是个好习惯 赋值以后，和初值应该没有关系了吧？

user: user-0
content: 引用 2 楼 paschen 的回复:0 & 1的结果肯定是0  看你断点断在哪了，或者看汇编，一般来说是编译器BUG的可能性很小  断点段在aaa = g_ArcDigitalInput.m_ArcDigitalIO & i; 这一行。 aaa是我测试的代码，原来的代码是给一个函数的输入参数赋值，就是上面注释的那行，也是一样的问题。还有一个比较有趣的是，这问题在Debug版本执行有问题，而release版本却没有问题。 原来的函数接口是：ERROR_ID ArcDIRead(__IN ARCDISIGNAL diindex, __OUT int *disignal) 这部分执行的代码是 	i = 1; 	i = i << diindex;     pthread_mutex_lock(&g_Mutex_ArcWeldingBasic);      if (g_ArcIOModule.m_Used > 0)     {         *disignal = g_ArcDigitalInput.m_ArcDigitalIO & i;     }  debug的部分汇编：       65:	c7 45 f4 01 00 00 00 	movl   $0x1,-0xc(%ebp)       6c:	8b 45 08             	mov    0x8(%ebp),%eax       6f:	89 c1                	mov    %eax,%ecx       71:	d3 65 f4             	shll   %cl,-0xc(%ebp)       74:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)       7b:	e8 fc ff ff ff       	call   7c <ArcDIRead+0x7c>       80:	a1 00 00 00 00       	mov    0x0,%eax       85:	85 c0                	test   %eax,%eax       87:	7e 11                	jle    9a <ArcDIRead+0x9a>  release的部分汇编：     1d94:	b8 01 00 00 00       	mov    $0x1,%eax     1d99:	89 f1                	mov    %esi,%ecx     1d9b:	d3 e0                	shl    %cl,%eax     1d9d:	23 05 04 00 00 00    	and    0x4,%eax     1da3:	89 03                	mov    %eax,(%ebx)     1da5:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)     1dac:	e8 fc ff ff ff       	call   1dad <ArcDIRead+0x4d>  我不知道贴这么些汇编试否能够说明问题？谢谢

user: user-4

user: user-0
content: 引用 1 楼 turingo 的回复:从你的图片上来看，那个1不像是1更像是字母i，你看看是不是打错了。  [quote=引用 楼主 lxr5109 的回复:] C程序，aaa、g_ArcDigitalInput.m_ArcDigitalIO和i都是unsigned int。 然后执行：aaa = g_ArcDigitalInput.m_ArcDigitalIO & i; 其中g_ArcDigitalInput.m_ArcDigitalIO = 0，i= 1。结果aaa居然等于1…… 其中g_ArcDigitalInput.m_ArcDigitalIO是全局变量，aaa和i都是局部变量。但是这段代 码被mutex保护了。 截图是这一句的执行结果    但后一句aaa = 0 & 1;结果又是正常的，aaa等于0[/quote]  是字母i，这个时候i就等于1

user: user-5
content: 建议将该函数的代码贴出来，同时与aaa有关的变量，可以先打印出来，这样缩小判定的范围。

user: user-4

user: user-1
content: 局部变量先进行初始化 是个好习惯

user: user-2
content: 0 & 1的结果肯定是0  看你断点断在哪了，或者看汇编，一般来说是编译器BUG的可能性很小

user: user-3
content: 从你的图片上来看，那个1不像是1更像是字母i，你看看是不是打错了。  引用 楼主 lxr5109 的回复:C程序，aaa、g_ArcDigitalInput.m_ArcDigitalIO和i都是unsigned int。 然后执行：aaa = g_ArcDigitalInput.m_ArcDigitalIO & i; 其中g_ArcDigitalInput.m_ArcDigitalIO = 0，i= 1。结果aaa居然等于1…… 其中g_ArcDigitalInput.m_ArcDigitalIO是全局变量，aaa和i都是局部变量。但是这段代 码被mutex保护了。 截图是这一句的执行结果    但后一句aaa = 0 & 1;结果又是正常的，aaa等于0