Aw: Re: Warning: shared mutable data

Helmut Zeisel HZ2012@gmx.at
Fri Feb 17 15:57:08 GMT 2023


Von: "Jonathan Wakely" <jwakely.gcc@gmail.com>


 > What exactly are you suggesting for the semantics of the warning? 

Good question. It is difficult to detect all suspiscious cases, but at least some of the can be defined:

If we have a function prototype 

f(...,Ti xi,...Tj xj,...)

and call the function f(... xi, ... xj,...) with some xi, xj with aliasing / data sharing,

and both Ti and Tj are references/pointers and at least one is a non-const pointer / reference,
then the warning should be given.

E.g. for both int:

Ti int: no warning
Ti int& or int*: warning if Tj is int*, const int*, int&, or const int&; no warning for Tj int.
Ti const int& or const int*: warning if Tj is int*, or int&; no warning if Tj is const int*, const int&, or int. 

Or maybe some code example:

void increase_x_by_y_and_z(int& x, const int& y, const int& z)
{
  x+=y;
  x+=z;
}

This should be OK (no sharing, no warning):

x=1;
y=1;
z=1;

increase_x_by_y_and_z(x,y,z);

This should give a warning (sharing of int& and const int&):

x=1;
y=1;

increase_x_by_y_and_z(x,y,x);

On the other hand, this is OK (y is shared but not mutable - two times const int&):

x=1;
y=1;

increase_x_by_y_and_z(x,y,y);


Helmut





More information about the Gcc mailing list