diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 6ce9a8875..09ce552ad 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -230,6 +230,7 @@ EXTRA_DIST = \ supp2.stderr.exp supp2.vgtest \ supp.supp \ suppfree.stderr.exp suppfree.supp suppfree.vgtest \ + suppfreecollision.stderr.exp suppfreecollision.supp suppfreecollision.vgtest \ test-plo-no.vgtest test-plo-no.stdout.exp \ test-plo-no.stderr.exp-le64 test-plo-no.stderr.exp-le32 \ test-plo-yes.vgtest test-plo-yes.stdout.exp \ diff --git a/memcheck/tests/suppfree.c b/memcheck/tests/suppfree.c index 8298f021a..1173f1bb5 100644 --- a/memcheck/tests/suppfree.c +++ b/memcheck/tests/suppfree.c @@ -22,9 +22,17 @@ void aaa (char* x) bbb(x); } -int main ( void ) +void ok_to_suppress_double_free_from_this_fun(char* y) +{ + aaa(y); +} + +int main ( int argc, char*argv[] ) { char* x = malloc(10); + char* y = malloc(10); + if (argc > 1) + ok_to_suppress_double_free_from_this_fun(y); aaa(x); return 0; } diff --git a/memcheck/tests/suppfree.stderr.exp b/memcheck/tests/suppfree.stderr.exp index e29d17bfd..62f5cccc7 100644 --- a/memcheck/tests/suppfree.stderr.exp +++ b/memcheck/tests/suppfree.stderr.exp @@ -4,12 +4,12 @@ Invalid free() / delete / delete[] / realloc() by 0x........: ccc (suppfree.c:12) by 0x........: bbb (suppfree.c:17) by 0x........: aaa (suppfree.c:22) - by 0x........: main (suppfree.c:28) + by 0x........: main (suppfree.c:36) Address 0x........ is 0 bytes inside a block of size 10 free'd at 0x........: free (vg_replace_malloc.c:...) by 0x........: ddd (suppfree.c:6) by 0x........: ccc (suppfree.c:12) by 0x........: bbb (suppfree.c:17) by 0x........: aaa (suppfree.c:22) - by 0x........: main (suppfree.c:28) + by 0x........: main (suppfree.c:36) diff --git a/memcheck/tests/suppfreecollision.stderr.exp b/memcheck/tests/suppfreecollision.stderr.exp new file mode 100644 index 000000000..e69de29bb diff --git a/memcheck/tests/suppfreecollision.supp b/memcheck/tests/suppfreecollision.supp new file mode 100644 index 000000000..414e8ae02 --- /dev/null +++ b/memcheck/tests/suppfreecollision.supp @@ -0,0 +1,11 @@ +{ + suppressnondangerouserror + Memcheck:Free + fun:free + fun:ddd + fun:ccc + fun:bbb + fun:aaa + fun:ok_to_suppress_double_free_from_this_fun + fun:main +} diff --git a/memcheck/tests/suppfreecollision.vgtest b/memcheck/tests/suppfreecollision.vgtest new file mode 100644 index 000000000..cda50aa7e --- /dev/null +++ b/memcheck/tests/suppfreecollision.vgtest @@ -0,0 +1,13 @@ +# this test the case of two errors, one considered not dangerous and +# suppressed, the other considered dangerous, and the user does +# not want to supress it. +# The suppression entry only match the non dangerous error. +# However, when a medium resolution is used to compare 2 errors, +# only the last 4 calls are used to determine that two errors are similar +# So, the nondangerous suppressed error "absorbs and hides" the dangerous +# error. +# This side effect of a medium (or low) resolution for error matching +# is I guess unexpected by most users. +prog: suppfree +args: activatenondangerouserror +vgopts: --suppressions=suppfreecollision.supp -q