[PATCH] D30764: Disable unsigned integer sanitizer for basic_string::replace()

Tom via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 8 16:49:42 PST 2017


tomcherry updated this revision to Diff 91111.
tomcherry added a comment.

Moved comments to an appropriate line


https://reviews.llvm.org/D30764

Files:
  include/string


Index: include/string
===================================================================
--- include/string
+++ include/string
@@ -2560,6 +2560,7 @@
 template <class _CharT, class _Traits, class _Allocator>
 basic_string<_CharT, _Traits, _Allocator>&
 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
+    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
 {
     _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
     size_type __sz = size();
@@ -2599,6 +2600,8 @@
         }
         traits_type::move(__p + __pos, __s, __n2);
 __finish:
+// __sz += __n2 - __n1; in this and the below function below can cause unsigned integer overflow,
+// but this is a safe operation, so we disable the check.
         __sz += __n2 - __n1;
         __set_size(__sz);
         __invalidate_iterators_past(__sz);
@@ -2612,6 +2615,7 @@
 template <class _CharT, class _Traits, class _Allocator>
 basic_string<_CharT, _Traits, _Allocator>&
 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
+    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
 {
     size_type __sz = size();
     if (__pos > __sz)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D30764.91111.patch
Type: text/x-patch
Size: 1247 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170309/29033a00/attachment-0001.bin>


More information about the cfe-commits mailing list