Warning: shared mutable data

2023-02-17 Thread Helmut Zeisel via Gcc
Recently I read about Value-Oriented Programming
( https://accu.org/journals/overload/31/173/teodorescu/ )
There it is pointed out that sharing mutable data. i. e., code like

my_push_back(vec, vec[0]);

can lead to subtle errors. Of course GCC cannot change C++ to a language like 
Val that forbids such code.
From my understanding, however, sharing of mutable data can be detected by the 
compiler on caller side
(looking at the prototype of the function - are all shared arguments const or 
is there some mutable argument?)
and it might be possible to add a warning "shared mutable data".

How difficult is it to implement such a warning?

If we have such a warning, it will be possible to get some information

.) How often such code occurs in real programs?
.) Is it difficult to fix such code (e.g. by making a copy of the data before 
passing it to the function)
.) Is it possible to find all such possbible errors when the complete program 
is compiled with this warning enabled?

Even if it were not possible to detect all cases, also detecting some cases 
might prevent some bugs.

What do you think about adding a warning "shared mutable data" to GCC?

Helmut Zeisel




Aw: Re: Warning: shared mutable data

2023-02-17 Thread Helmut Zeisel via Gcc
Von: "Jonathan Wakely" 


 > 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





GCC 13.1 compile error when using CXXFLAGS=-std=c++20

2023-04-27 Thread Helmut Zeisel via Gcc
I compiled GCC 13.1.0 with GCC 12 and had the environment variable CXXFLAGS set 
to -std=c++20
This gives the error (both linux and cygin)

gcc-13.1.0/libstdc++-v3/src/c++98/bitmap_allocator.cc:51:23: error: ISO C++17 
does not allow dynamic exception specifications
   51 |   _M_get(size_t __sz) throw(std::bad_alloc)

After

   unset CXXFLAGS

compilation works

Helmut


Aw: Re: GCC 13.1 compile error when using CXXFLAGS=-std=c++20

2023-04-27 Thread Helmut Zeisel via Gcc
>Von: "Jakub Jelinek" 
>An: "Helmut Zeisel" 
>Cc: gcc@gcc.gnu.org
>Betreff: Re: GCC 13.1 compile error when using CXXFLAGS=-std=c++20
>On Thu, Apr 27, 2023 at 11:09:19AM +0200, Helmut Zeisel via Gcc wrote:
>> I compiled GCC 13.1.0 with GCC 12 and had the environment variable CXXFLAGS 
>> set to -std=c++20
>> This gives the error (both linux and cygin)
>>
>> gcc-13.1.0/libstdc++-v3/src/c++98/bitmap_allocator.cc:51:23: error: ISO 
>> C++17 does not allow dynamic exception specifications
>> 51 | _M_get(size_t __sz) throw(std::bad_alloc)
>>
>> After
>>
>> unset CXXFLAGS
>>
>> compilation works

>Don't do it. 

Dont do *what*?
export CXXFLAGS=... ?
unset CXXFLAGS ?
Compile GCC 13 with GCC 12?

Helmut


When do I need -fnon-call-exceptions?

2023-06-07 Thread Helmut Zeisel via Gcc
I wrote some simple program that set a signal handler for SIGFPE, throws a C++ 
exception in the signal handler
and catches the exception.
I compiled with and without -fnon-call-exceptions (on x64 Linux).
In both cases, the result was the same: the exception was caught and the 
destructors were called as expected.
I also tried "-fno-non-call-exceptions -fexceptions" and got the same result.

My question: when do I really need -fnon-call-exceptions?
Is there some simple program where I can see the difference whether it is on or 
off??

Helmut



What should be the type of 9223372036854775808L ? unsigned long or signed __int128?

2023-08-08 Thread Helmut Zeisel via Gcc
GCC13, c++, cygwin 64:

auto x = 9223372036854775808L

gives the  warning: "integer constant is so large that it is unsigned"

But actually the type is signed __int128:

std::cout << x; 

gives the error: "ambiguous overload for ‘operator<<’ (operand types are 
‘std::ostream’ {aka ‘std::basic_ostream’} and ‘__int128’"

and

std::cout << (x-x-1<0) << std::endl;

prints 1.

So what is the correct type of  9223372036854775808L ?
unsigned long, as the warning says, or signed __int128?

Helmut