[ros-dev] gcc problem or not
Joseph Galbraith
galb at vandyke.com
Tue May 3 16:50:33 CEST 2005
Hartmut Birr wrote:
> Hi,
>
> I've looked on a map file from an optimized build. I found the following
> code:
>
> /*
> * If the directory containing the file to open doesn't exist then
> * fail immediately
> */
> if (Status == STATUS_OBJECT_PATH_NOT_FOUND ||
> 12015: 83 c4 0c add $0xc,%esp
> 12018: 89 c3 mov %eax,%ebx
> 1201a: 3d 3a 00 00 c0 cmp $0xc000003a,%eax
> 1201f: 0f 94 c2 sete %dl
> 12022: 3d 0d 00 00 c0 cmp $0xc000000d,%eax
> 12027: 0f 94 c0 sete %al
> 1202a: 09 d0 or %edx,%eax
> 1202c: a8 01 test $0x1,%al
> 1202e: 0f 85 42 01 00 00 jne 12176 <_VfatCreateFile+0x2e9>
> 12034: 81 fb 56 00 00 c0 cmp $0xc0000056,%ebx
> 1203a: 0f 84 36 01 00 00 je 12176 <_VfatCreateFile+0x2e9>
> Status == STATUS_INVALID_PARAMETER ||
> Status == STATUS_DELETE_PENDING)
> {
> if (ParentFcb)
> {
> vfatReleaseFCB (DeviceExt, ParentFcb);
> }
> return(Status);
> }
>
> I was always the opinion that the examination of a test condition stops
> if the result can not change again. A test condition like this:
>
> if (pointer == NULL || pointer->member == 0)
>
> should never access pointer->member if pointer is zero. Compared with
> the code above, it is possible that gcc build the result from the right
> side of the OR statement. This may hit a page fault. Is this a bug in gcc?
Hmmm... if gcc were to evaluate pointer->member in the
above example, that would definitely be a horrendous gcc
bug.
However, in the example you gave the dissambly for, I believe
gcc can evaluate eax multiple times before 'shortcutting'
the evaluation, because it knows that evaluating eax multiple
times can't have side effects.
Does the if ( ! p || ! p->x ) case generate similar assembler?
Thanks,
Joseph
PS. I disclaim all responsibility for this answer, I have no
idea what I'm talking about. Everything here is pure speculation.
More information about the Ros-dev
mailing list