File pr26399.patch of Package gcc41
Jan Hubicka
PR profile/20815
PR profile/26399
* coverage.c (coverage_checksum_string): Reorganize loop to not read
after buffer.
* g++.dg/bprob/g++-bprob-2.C: New testcase.
Index: gcc/coverage.c
===================================================================
*** gcc/coverage.c (revision 113342)
--- gcc/coverage.c (working copy)
*************** coverage_checksum_string (unsigned chksu
*** 457,486 ****
to be no better chance then walk all possible offsets looking
for magicnuber. */
if (offset)
! for (;string[offset]; offset++)
! for (i = i + offset; string[i]; i++)
! if (string[i]=='_')
! {
! int y;
!
! for (y = 1; y < 9; y++)
! if (!(string[i + y] >= '0' && string[i + y] <= '9')
! && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
! break;
! if (y != 9 || string[i + 9] != '_')
! continue;
! for (y = 10; y < 18; y++)
! if (!(string[i + y] >= '0' && string[i + y] <= '9')
! && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
! break;
! if (y != 18)
! continue;
! if (!dup)
! string = dup = xstrdup (string);
! for (y = 10; y < 18; y++)
! dup[i + y] = '0';
! }
! break;
}
chksum = crc32_string (chksum, string);
--- 457,487 ----
to be no better chance then walk all possible offsets looking
for magicnuber. */
if (offset)
! {
! for (i = i + offset; string[i]; i++)
! if (string[i]=='_')
! {
! int y;
!
! for (y = 1; y < 9; y++)
! if (!(string[i + y] >= '0' && string[i + y] <= '9')
! && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
! break;
! if (y != 9 || string[i + 9] != '_')
! continue;
! for (y = 10; y < 18; y++)
! if (!(string[i + y] >= '0' && string[i + y] <= '9')
! && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
! break;
! if (y != 18)
! continue;
! if (!dup)
! string = dup = xstrdup (string);
! for (y = 10; y < 18; y++)
! dup[i + y] = '0';
! }
! break;
! }
}
chksum = crc32_string (chksum, string);
--- /dev/null 2006-03-04 21:11:20.000000000 +0100
+++ gcc/testsuite/g++.dg/bprob/g++-bprob-2.C 2006-04-28 13:46:24.000000000 +0200
@@ -0,0 +1,15 @@
+namespace {
+
+int calc(int j)
+{
+ if (j==0) return 0;
+ return calc(j-1)*j % 17;
+}
+
+}
+
+int main(void)
+{
+ return calc(25);
+}
+