Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C99: Is it possible to portably determine if two pointers point within the same aggregate?

In c99, my understanding is that comparing two pointers which do not point within the same aggregate results in undefined behavior. Given an aggregate A, a pointer p_good which is known to point within A, and a pointer p_unknown which may or may not point within A, is it possible to construct a portable test with defined behavior which determines whether it is safe to compare p_good and p_unknown?

Obviously, this test cannot itself fall afoul of the restrictions on comparing pointers.

I suspect that the answer is 'no', but I'd be happy to be shown otherwise.

like image 482
acm Avatar asked Aug 28 '12 18:08

acm


1 Answers

You commented:

Another way to frame the question would be like this: Given the definition of an aggregate 'A' and a pointer p, is it possible to answer the question 'does p point within A' without violating the rule on inequality testing of pointers to different aggregates

The only way I can interpret this meaningfully is that you either have an object of type Aggregate type or a pointer to one. Then the answer is simple:

Pseudo-code:

bool p_in_A = false;
for (each element in Aggregate A)
    if (&element == p)
        p_in_A = true;

There is no way to tell whether a stray pointer belongs to an unknown aggregate object (or points to "between" elements in an aggregate).

like image 72
eq- Avatar answered Oct 12 '22 02:10

eq-