[ros-dev] gcc problem or not

Hartmut Birr hartmut.birr at gmx.de
Tue May 3 21:43:54 CEST 2005


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?

- Hartmut



More information about the Ros-dev mailing list