[Openmp-commits] [PATCH] D143401: [OpenMP][libomp] Remove false positive for memory sanitizer

Jonathan Peyton via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Mon Feb 6 07:19:57 PST 2023

jlpeyton created this revision.
jlpeyton added reviewers: jhuber6, tianshilei1992.
jlpeyton added a project: OpenMP.
Herald added subscribers: guansong, yaxunl.
Herald added a project: All.
jlpeyton requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.

The memory sanitizer intercepts the `memcpy()` call but not the direct assignment of last byte to 0. This leads the sanitizer to believe the last byte of a string based on the `kmp_str_buf_t` type is uninitialized. Hence, the eventual `strlen()` inside `__kmp_env_dump()` leads to an `use-of-uninitialized-value` warning.

Using `strncat()` instead gives the sanitizer the information it needs.

Fixes #60501

  rG LLVM Github Monorepo



Index: openmp/runtime/src/kmp_str.cpp
--- openmp/runtime/src/kmp_str.cpp
+++ openmp/runtime/src/kmp_str.cpp
@@ -137,8 +137,7 @@
   KMP_DEBUG_ASSERT(len >= 0);
   __kmp_str_buf_reserve(buffer, buffer->used + len + 1);
-  KMP_MEMCPY(buffer->str + buffer->used, str, len);
-  buffer->str[buffer->used + len] = 0;
+  KMP_STRNCAT_S(buffer->str + buffer->used, len + 1, str, len);
   __kmp_type_convert(buffer->used + len, &(buffer->used));
 } // __kmp_str_buf_cat
@@ -151,8 +150,7 @@
   if (!src->str || !src->used)
   __kmp_str_buf_reserve(dest, dest->used + src->used + 1);
-  KMP_MEMCPY(dest->str + dest->used, src->str, src->used);
-  dest->str[dest->used + src->used] = 0;
+  KMP_STRNCAT_S(dest->str + dest->used, src->used + 1, src->str, src->used);
   dest->used += src->used;
 } // __kmp_str_buf_catbuf
Index: openmp/runtime/src/kmp_safe_c_api.h
--- openmp/runtime/src/kmp_safe_c_api.h
+++ openmp/runtime/src/kmp_safe_c_api.h
@@ -30,6 +30,7 @@
 #define KMP_SSCANF sscanf_s
 #define KMP_STRCPY_S strcpy_s
 #define KMP_STRNCPY_S strncpy_s
+#define KMP_STRNCAT_S strncat_s
 // Use this only when buffer size is unknown
 #define KMP_MEMCPY(dst, src, cnt) memcpy_s(dst, cnt, src, cnt)
@@ -61,6 +62,7 @@
 #define KMP_SSCANF sscanf
 #define KMP_STRCPY_S(dst, bsz, src) strcpy(dst, src)
 #define KMP_STRNCPY_S(dst, bsz, src, cnt) strncpy(dst, src, cnt)
+#define KMP_STRNCAT_S(dst, bsz, src, cnt) strncat(dst, src, cnt)
 #define KMP_VSNPRINTF vsnprintf
 #define KMP_STRNCPY strncpy
 #define KMP_STRLEN strlen

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143401.495119.patch
Type: text/x-patch
Size: 1722 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20230206/2ff359b1/attachment.bin>

More information about the Openmp-commits mailing list