aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2022-12-29 14:33:07 -0300
committerAlexandre Oliva <oliva@gnu.org>2022-12-29 14:39:47 -0300
commit603da201681ad06342055e8c12a656f5289e52a8 (patch)
tree4312591c8fce568e824ab3875e420cd4b769b8cc /gcc
parent512af6c3803c4714cb2a92a8db263fb7f2b4ea10 (diff)
downloadgcc-603da201681ad06342055e8c12a656f5289e52a8.zip
gcc-603da201681ad06342055e8c12a656f5289e52a8.tar.gz
gcc-603da201681ad06342055e8c12a656f5289e52a8.tar.bz2
prevent hash set/map insertion of deleted entries
Just like the recently-added checks for empty entries, add checks for deleted entries as well. This didn't catch any problems, but it might prevent future accidents. Suggested by David Malcolm. for gcc/ChangeLog * hash-map.h (put, get_or_insert): Check that added entry doesn't look deleted either. * hash-set.h (add): Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/hash-map.h8
-rw-r--r--gcc/hash-set.h3
2 files changed, 7 insertions, 4 deletions
diff --git a/gcc/hash-map.h b/gcc/hash-map.h
index 63fa21c..e6ca9cf 100644
--- a/gcc/hash-map.h
+++ b/gcc/hash-map.h
@@ -173,8 +173,9 @@ public:
if (ins)
{
e->m_key = k;
- new ((void *) &e->m_value) Value (v);
- gcc_checking_assert (!Traits::is_empty (*e));
+ new ((void *)&e->m_value) Value (v);
+ gcc_checking_assert (!Traits::is_empty (*e)
+ && !Traits::is_deleted (*e));
}
else
e->m_value = v;
@@ -204,7 +205,8 @@ public:
{
e->m_key = k;
new ((void *)&e->m_value) Value ();
- gcc_checking_assert (!Traits::is_empty (*e));
+ gcc_checking_assert (!Traits::is_empty (*e)
+ && !Traits::is_deleted (*e));
}
if (existed != NULL)
diff --git a/gcc/hash-set.h b/gcc/hash-set.h
index a98121a..08e1851 100644
--- a/gcc/hash-set.h
+++ b/gcc/hash-set.h
@@ -61,7 +61,8 @@ public:
{
new (e) Key (k);
// Catch attempts to insert e.g. a NULL pointer.
- gcc_checking_assert (!Traits::is_empty (*e));
+ gcc_checking_assert (!Traits::is_empty (*e)
+ && !Traits::is_deleted (*e));
}
return existed;