Hello,

the following C++ test case:

struct pollfd
  {
    int fd;
    short int events;
    short int revents;
  };

struct Pollfd : public pollfd { };

struct Pollfd myfd[10];

int test (void)
{
  return __builtin_object_size ((struct pollfd *)myfd, 1);
}

ends up returning 8 from the "test" routine, not 80.


In the real-world application this test case was extracted from,
this causes a call:

  poll(myfd, count, 0);  // 1 < count < 10

to fail with a "Buffer overflow detected" message at run-time
when building with _FORTIFY_SOURCE = 2 against glibc.  [ Here,
there is no explicit cast, but it is implied by the prototype
of the "poll" routine. ]

(Note that in the real-world application, the derived struct Pollfd
has some member functions to construct and pretty-print the structure,
but has no additional data members.)


>From the __builtin_object_size documentation, it's not immediately
clear to me whether this is supposed to work or not:

   If the least significant
   bit is clear, objects are whole variables, if it is set, a closest
   surrounding subobject is considered the object a pointer points to.

Is the presence of the above cast (explicit or implicit) supposed to
modify the notion of "closest surrounding subobject"?


Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  ulrich.weig...@de.ibm.com

Reply via email to