// Safe swap integer. (1.00)
#include <limits.h>
#include <stdio.h>
void swapint( int * a, int * b)
{
int t = * a; * a = * b; * b = t; // preferred
}
void swapint_xor( int * a, int * b)
{
if ( a != b)
{
* a ^= * b; * b ^= * a; * a ^= * b;
}
}
void swapint_add( int * a, int * b)
{
if ( a != b)
{
__builtin_add_overflow( * a, * b, a) ;
__builtin_sub_overflow( * a, * b, b) ;
__builtin_sub_overflow( * a, * b, a) ;
}
}
int main( void )
{
typedef void ( * swap_type) ( int *, int * ) ;
swap_type fs[ ] = {
swapint,
swapint_xor,
swapint_add,
0
} ;
for ( swap_type * f = fs; * f; f++ )
{
int a = 1 ;
int b = INT_MAX;
( * f) ( & a, & b) ;
printf ( "f(a,b): a = %d, b = %d; " , a
, b
) ; ( * f) ( & a, & a) ;
printf ( "f(a,a): a = %d\n " , a
) ; }
return 0 ;
}
Ly8gU2FmZSBzd2FwIGludGVnZXIuICgxLjAwKQoKI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnZvaWQgc3dhcGludChpbnQgKmEsIGludCAqYikKewogICAgaW50IHQgPSAqYTsgKmEgPSAqYjsgKmIgPSB0OyAvLyBwcmVmZXJyZWQKfQoKdm9pZCBzd2FwaW50X3hvcihpbnQgKmEsIGludCAqYikKewogICAgaWYgKGEgIT0gYikKICAgIHsKICAgICAgICAqYSBePSAqYjsgKmIgXj0gKmE7ICphIF49ICpiOwogICAgfQp9Cgp2b2lkIHN3YXBpbnRfYWRkKGludCAqYSwgaW50ICpiKQp7CiAgICBpZiAoYSAhPSBiKQogICAgewogICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coKmEsICpiLCBhKTsKICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCphLCAqYiwgYik7CiAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygqYSwgKmIsIGEpOwogICAgfQp9CgppbnQgbWFpbih2b2lkKQp7CiAgICB0eXBlZGVmIHZvaWQgKCpzd2FwX3R5cGUpKGludCAqLCBpbnQgKik7CgogICAgc3dhcF90eXBlIGZzW10gPSB7CiAgICAgICAgc3dhcGludCwKICAgICAgICBzd2FwaW50X3hvciwKICAgICAgICBzd2FwaW50X2FkZCwKICAgICAgICAwCiAgICB9OwoKICAgIGZvciAoc3dhcF90eXBlICpmID0gZnM7ICpmOyBmKyspCiAgICB7CiAgICAgICAgaW50IGEgPSAxOwogICAgICAgIGludCBiID0gSU5UX01BWDsKICAgICAgICAoKmYpKCZhLCAmYik7CiAgICAgICAgcHJpbnRmKCJmKGEsYik6IGEgPSAlZCwgYiA9ICVkOyAiLCBhLCBiKTsKICAgICAgICAoKmYpKCZhLCAmYSk7CiAgICAgICAgcHJpbnRmKCJmKGEsYSk6IGEgPSAlZFxuIiwgYSk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==
stdout
f(a,b): a = 2147483647, b = 1; f(a,a): a = 2147483647
f(a,b): a = 2147483647, b = 1; f(a,a): a = 2147483647
f(a,b): a = 2147483647, b = 1; f(a,a): a = 2147483647