-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
UPC 1.3 6.4.3:
If a non-null pointer-to-shared is cast to a pointer-to-local and the affinity
of any byte comprising the pointed-to shared object is not to the current
thread, the result is undefined.
This language prohibits invalid cast-to-local for pointers to remote objects.
However, as currently specified there is a loophole (or at least an ambiguity),
for the case of a pointer-to-shared with incomplete referent type. Such
pointers do not "point-to" any object, and therefore the requirement is
trivially satisfied, although we still need to prohibit such casts.
Consider:
shared int x;
int main() {
shared void *svp = &x;
void *lvp = (void *)svp; // svp does not point to an object type
int *lip = (int *)lvp;
*lip = 7;
return 0;
}
The cast in the second line needs to have an undefined result when MYTHREAD!=0,
and most implementations and users probably assume that is the case. However
the current language is not strong enough to prohibit this cast because the
referent type is incomplete - svp does not point to an object, and therefore
there are no bytes to fail the affinity check.
The rule should probably be strengthened with an additional clause to cover
pointers to incomplete types (eg possibly requiring
upc_threadof(ptr_expression) to equal the value of MYTHREAD).
Original issue reported on code.google.com by danbonachea
on 6 Mar 2014 at 2:53