expression mutator: functions with side effects
I'm looking at a case in which a mutated expression calls a function with side-effects twice, causing the values in the execution to be different.
Checking fail:
/home/gj/metamorphicCL/metamorphiccl/python/mmc_generate.py /home/gj/ocl/gcctestsuite/generic-c99/gcc.dg_atomic-op-4.c -o /home/gj/tmp/gcc.dg_atomic-op-4 --num-variants 2 --seed 221478 --percentageDead 15 --percentageExpr 10 --percentageGoto 20 --percentageSwitch 30
####
/home/gj/metamorphicCL/metamorphiccl/python/mmc_check.py --dir /home/gj/tmp/gcc.dg_atomic-op-4 --cc gcc
Original function:
void test_sub_fetch()
{
v = res = 20;
count = 0;
if (__atomic_sub_fetch(&v, count + 1, 0) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, 1, 1) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, count + 1, 2) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, 1, 3) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, count + 1, 4) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, count + 1, 5) != --res) {
abort();
}
}
Mutated and reduced function:
void test_sub_fetch()
{
v = res = 20;
count = 0;
if (__atomic_sub_fetch(&v, count + 1,
0) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, 1, 1) != --res) {
abort();
}
if (__IDENTITY_ROOT(
__atomic_sub_fetch(&v, count + 1, 2), (long long)((long long)((long long)(__IDENTITY_div_one((long long)((long long)((long long)((__atomic_sub_fetch(&v, count + 1, 2))))), (long long)(__ONE_ternary_guard_zero((long long)((long long)(((long long)(0)))), (long long)(0), (long long)((long long)(((long long)(__ONE_or_one_second((long long)((__atomic_sub_fetch(&v, count + 1, 2))), (long long)(((long long)(1))))))))))))))) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, 1, 3) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, count + 1, 4) != --res) {
abort();
}
if (__atomic_sub_fetch(&v, count + 1, 5) != --res) {
abort();
}
}