diff mbox

[MPX,wrappers,1/3] Add MPX wrappers library

Message ID 20141114172601.GA20207@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Nov. 14, 2014, 5:26 p.m. UTC
Hi,

This patch introduces a simple library with several wrappers to be used with MPX and Pointer Bounds Checker.  Wrappers allow to obtain, copy and just keep alive bounds whrough widely use library calls.  It significantly increases checking  quality.

Thanks,
Ilya
--
gcc/

2014-11-14  Ilya Enkovich  <ilya.enkovich@intel.com>

	* gcc.c (MPX_SPEC): Add wrappers library.

libmpx/

2014-11-14  Ilya Enkovich  <ilya.enkovich@intel.com>

	* Makefile.am (SUBDIRS): New.
	(MAKEOVERRIDES): New.
	* Makefile.in: Regenerate.
	* configure.ac: Add mpxintr/Makefile to config
	files.
	* configure: Regenerate.
	* mpxwrap/Makefile.am: New.
	* mpxwrap/Makefile.in: New.
	* mpxwrap/libtool-version: New.
	* mpxwrap/mpx_wrappers.cc: New.

Comments

Joseph Myers Nov. 14, 2014, 7 p.m. UTC | #1
On Fri, 14 Nov 2014, Ilya Enkovich wrote:

> Hi,
> 
> This patch introduces a simple library with several wrappers to be used 
> with MPX and Pointer Bounds Checker.  Wrappers allow to obtain, copy and 
> just keep alive bounds whrough widely use library calls.  It 
> significantly increases checking quality.

Please use symbol versioning in the new library (so the exported functions 
are versioned at some symbol version, and any functions added in future 
for GCC 6 that aren't in the version shipped with GCC 5 get a new symbol 
version, and so on).
Jeff Law Nov. 15, 2014, 7:10 a.m. UTC | #2
On 11/14/14 10:26, Ilya Enkovich wrote:
> Hi,
>
> This patch introduces a simple library with several wrappers to be used with MPX and Pointer Bounds Checker.  Wrappers allow to obtain, copy and just keep alive bounds whrough widely use library calls.  It significantly increases checking  quality.
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2014-11-14  Ilya Enkovich  <ilya.enkovich@intel.com>
>
> 	* gcc.c (MPX_SPEC): Add wrappers library.
>
> libmpx/
>
> 2014-11-14  Ilya Enkovich  <ilya.enkovich@intel.com>
>
> 	* Makefile.am (SUBDIRS): New.
> 	(MAKEOVERRIDES): New.
> 	* Makefile.in: Regenerate.
> 	* configure.ac: Add mpxintr/Makefile to config
> 	files.
> 	* configure: Regenerate.
> 	* mpxwrap/Makefile.am: New.
> 	* mpxwrap/Makefile.in: New.
> 	* mpxwrap/libtool-version: New.
> 	* mpxwrap/mpx_wrappers.cc: New.
As Joseph mentioned, symbol versioning.  Anytime a target side library 
is added to GCC, it should be properly versioned.

Don't forget copyright headers in the new files.  Remember it has to be 
suitable for embeddeding in the target without infecting the target with 
the GPL.  LGPL or GPL + exception clause seem the most appropriate to me.


Jeff
diff mbox

Patch

diff --git a/gcc/gcc.c b/gcc/gcc.c
index 200704b..cf028ed 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -806,9 +806,10 @@  proper position among the other output files.  */
 
 #ifndef MPX_SPEC
 #define MPX_SPEC "\
-%{!nostdlib:%{!nodefaultlibs:%{mmpx:\
+%{!nostdlib:%{!nodefaultlibs:%{mmpx:%{fcheck-pointer-bounds:\
     %{static:%nMPX runtime is disabled due to -static used}\
-    %{!static:-lmpx}}}}"
+    %{!static:-lmpx}\
+    %{!fno-chkp-use-wrappers:-lmpxwrappers}}}}}"
 #endif
 
 /* -u* was put back because both BSD and SysV seem to support it.  */
diff --git a/libmpx/Makefile.am b/libmpx/Makefile.am
index c6b479f..553ad30 100644
--- a/libmpx/Makefile.am
+++ b/libmpx/Makefile.am
@@ -1,6 +1,9 @@ 
 ACLOCAL_AMFLAGS = -I .. -I ../config
 
-SUBDIRS = mpxrt
+SUBDIRS = mpxrt mpxwrap
+
+## May be used by toolexeclibdir.
+gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
@@ -39,3 +42,5 @@  AM_MAKEFLAGS = \
 	"PICFLAG=$(PICFLAG)" \
 	"RANLIB=$(RANLIB)" \
 	"DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES =
diff --git a/libmpx/configure.ac b/libmpx/configure.ac
index 9a761c4..f3abead 100644
--- a/libmpx/configure.ac
+++ b/libmpx/configure.ac
@@ -110,7 +110,7 @@  fi
 
 AC_CONFIG_FILES([Makefile])
 AC_CONFIG_HEADERS(config.h)
-AC_CONFIG_FILES(AC_FOREACH([DIR], [mpxrt], [DIR/Makefile]),
+AC_CONFIG_FILES(AC_FOREACH([DIR], [mpxrt mpxwrap], [DIR/Makefile ]),
   [cat > vpsed$$ << \_EOF
 s!`test -f '$<' || echo '$(srcdir)/'`!!
 _EOF
diff --git a/libmpx/mpxwrap/Makefile.am b/libmpx/mpxwrap/Makefile.am
new file mode 100644
index 0000000..bad206d
--- /dev/null
+++ b/libmpx/mpxwrap/Makefile.am
@@ -0,0 +1,52 @@ 
+ALCLOCAL_AMFLAGS = -I .. -I ../config
+
+# May be used by toolexeclibdir.
+gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
+
+libmpxwrappers_la_CFLAGS = -fcheck-pointer-bounds -mmpx -fno-chkp-check-read \
+			   -fno-chkp-check-write -fno-chkp-use-wrappers
+
+toolexeclib_LTLIBRARIES = libmpxwrappers.la
+
+libmpxwrappers_la_SOURCES = mpx_wrappers.c
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+       "AR_FLAGS=$(AR_FLAGS)" \
+       "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+       "CFLAGS=$(CFLAGS)" \
+       "CXXFLAGS=$(CXXFLAGS)" \
+       "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+       "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+       "INSTALL=$(INSTALL)" \
+       "INSTALL_DATA=$(INSTALL_DATA)" \
+       "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+       "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+       "JC1FLAGS=$(JC1FLAGS)" \
+       "LDFLAGS=$(LDFLAGS)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+       "MAKE=$(MAKE)" \
+       "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+       "PICFLAG=$(PICFLAG)" \
+       "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+       "SHELL=$(SHELL)" \
+       "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+       "exec_prefix=$(exec_prefix)" \
+       "infodir=$(infodir)" \
+       "libdir=$(libdir)" \
+       "prefix=$(prefix)" \
+       "includedir=$(includedir)" \
+       "AR=$(AR)" \
+       "AS=$(AS)" \
+       "LD=$(LD)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "NM=$(NM)" \
+       "PICFLAG=$(PICFLAG)" \
+       "RANLIB=$(RANLIB)" \
+       "DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES =
+
diff --git a/libmpx/mpxwrap/libtool-version b/libmpx/mpxwrap/libtool-version
new file mode 100644
index 0000000..bfe84c8
--- /dev/null
+++ b/libmpx/mpxwrap/libtool-version
@@ -0,0 +1,6 @@ 
+# This file is used to maintain libtool version info for libmpxintr.  See
+# the libtool manual to understand the meaning of the fields.  This is
+# a separate file so that version updates don't involve re-running
+# automake.
+# CURRENT:REVISION:AGE
+1:0:0
diff --git a/libmpx/mpxwrap/mpx_wrappers.c b/libmpx/mpxwrap/mpx_wrappers.c
new file mode 100644
index 0000000..5285da4
--- /dev/null
+++ b/libmpx/mpxwrap/mpx_wrappers.c
@@ -0,0 +1,238 @@ 
+#include "stdlib.h"
+#include "string.h"
+#include <sys/mman.h>
+
+void *
+__mpx_wrapper_malloc (size_t size)
+{
+  void *p = (void *)malloc (size);
+  if (!p) return __bnd_null_ptr_bounds (p);
+  return __bnd_set_ptr_bounds (p, size);
+}
+
+
+void *
+__mpx_wrapper_mmap (void *addr, size_t length, int prot, int flags,
+		    int fd, off_t offset)
+{
+  void *p = mmap (addr, length, prot, flags, fd, offset);
+  if (!p) return __bnd_null_ptr_bounds (p);
+  return __bnd_set_ptr_bounds (p, length);
+}
+
+void *
+__mpx_wrapper_realloc (void *ptr, size_t n)
+{
+  if (!ptr)
+    return __mpx_wrapper_malloc (n);
+
+  /* We don't kwnow how much data is copied by realloc
+     and therefore may check only lower bounds.  */
+  __bnd_chk_ptr_lbounds (ptr);
+  ptr = realloc (ptr, n);
+
+  if (!ptr)
+    return __bnd_null_ptr_bounds (ptr);
+
+  return __bnd_set_ptr_bounds (ptr, n);
+}
+
+void *
+__mpx_wrapper_calloc (size_t n_elements, size_t element_size)
+{
+  void *p = calloc (n_elements, element_size);
+  if (!p)
+    return __bnd_null_ptr_bounds (p);
+  return __bnd_set_ptr_bounds (p, n_elements * element_size);
+}
+
+void *
+__mpx_wrapper_memset (void *dstpp, int c, size_t len)
+{
+  if (len > 0)
+    {
+      __bnd_chk_ptr_bounds (dstpp, len);
+      memset (dstpp, c, len);
+    }
+  return dstpp;
+}
+
+void
+__mpx_wrapper_bzero (void *dst, size_t len)
+{
+  __mpx_wrapper_memset (dst, 0, len);
+}
+
+void *
+__mpx_wrapper_memmove (void *dst, const void *src, size_t n)
+{
+  const char *s = (const char*)src;
+  char *d = (char*)dst;
+  void *ret = dst;
+  size_t offset_src = ((size_t) s) & (sizeof (void *) - 1);
+  size_t offset_dst = ((size_t) d) & (sizeof (void *) - 1);
+
+  __bnd_chk_ptr_bounds (dst, n);
+  __bnd_chk_ptr_bounds (src, n);
+
+  /* Different alignment means that even if
+     pointers exist in memory, we don't how
+     pointers are aligned and therefore cann't
+     copy bounds anyway.  */
+  if (offset_src != offset_dst)
+    memmove (dst, src, n);
+  else
+    {
+      if (s < d)
+	{
+	  d += n;
+	  s += n;
+	  offset_src = (offset_src + n) & (sizeof (void *) -1);
+	  while (n-- && offset_src--)
+	    *--d = *--s;
+	  n++;
+	  if (!n)
+	    return ret;
+	  void **d1 = (void **)d;
+	  void **s1 = (void **)s;
+	  /* This loop will also copy bounds.  */
+	  while (n >= sizeof (void *))
+	    {
+	      n -= sizeof (void *);
+	      *--d1 = *--s1;
+	    }
+	  s = (char *)s1;
+	  d = (char *)d1;
+	  while (n--)
+	    *--d = *--s;
+	}
+      else
+	{
+	  offset_src = sizeof (void *) - offset_src;
+	  while (n-- && offset_src--)
+	    *d++ = *s++;
+	  n++;
+	  if (!n)
+	    return ret;
+	  void **d1 = (void **)d;
+	  void **s1 = (void **)s;
+	  /* This loop will also copy bounds.  */
+	  while (n >= sizeof (void *))
+	    {
+	      n -= sizeof (void *);
+	      *d1++ = *s1++;
+	    }
+	  s = (char *)s1;
+	  d = (char *)d1;
+	  while (n--)
+	    *d++ = *s++;
+	}
+    }
+  return ret;
+}
+
+
+void *
+__mpx_wrapper_memcpy (void *dst, const void *src, size_t n)
+{
+  return __mpx_wrapper_memmove (dst, src, n);
+}
+
+void *
+__mpx_wrapper_mempcpy (void *dst, const void *src, size_t n)
+{
+  return (char *)__mpx_wrapper_memcpy (dst, src, n) + n;
+}
+
+char *
+__mpx_wrapper_strncat (char *dst, const char *src, size_t n)
+{
+  size_t dst_size = strlen (dst);
+  size_t src_size = strnlen (src, n);
+
+  __bnd_chk_ptr_bounds (dst, dst_size + src_size + 1);
+  if (src_size < n)
+    __bnd_chk_ptr_bounds (src, src_size + 1);
+  else
+    __bnd_chk_ptr_bounds (src, src_size);
+
+  strncat (dst, src, n);
+
+  return dst;
+}
+
+char *
+__mpx_wrapper_strcat (char *dst, const char *src)
+{
+  size_t dst_size = strlen (dst);
+  size_t src_size = strlen (src);
+
+  __bnd_chk_ptr_bounds (dst, dst_size + src_size + 1);
+  __bnd_chk_ptr_bounds (src, src_size + 1);
+
+  strcat (dst, src);
+
+  return dst;
+}
+
+char *
+__mpx_wrapper_stpcpy (char *dst, const char *src)
+{
+  size_t src_size = strlen (src);
+
+  __bnd_chk_ptr_bounds (dst, src_size + 1);
+  __bnd_chk_ptr_bounds (src, src_size + 1);
+
+  memcpy (dst, src, src_size + 1);
+
+  return dst + src_size;
+}
+
+char *
+__mpx_wrapper_stpncpy (char *dst, const char *src, size_t n)
+{
+  size_t src_size = strnlen (src, n);
+
+  __bnd_chk_ptr_bounds (dst, n);
+  if (src_size < n)
+    __bnd_chk_ptr_bounds (src, src_size + 1);
+  else
+    __bnd_chk_ptr_bounds (src, src_size);
+
+  return dst + src_size;
+}
+
+char *
+__mpx_wrapper_strcpy (char *dst, const char *src)
+{
+  size_t src_size = strlen (src);
+
+  __bnd_chk_ptr_bounds (dst, src_size + 1);
+  __bnd_chk_ptr_bounds (src, src_size + 1);
+
+  memcpy (dst, src, src_size + 1);
+
+  return dst;
+}
+
+char *
+__mpx_wrapper_strncpy (char *dst, const char *src, size_t n)
+{
+  size_t src_size = strnlen (src, n);
+
+  __bnd_chk_ptr_bounds (dst, n);
+  if (src_size < n)
+    __bnd_chk_ptr_bounds (src, src_size + 1);
+  else
+    __bnd_chk_ptr_bounds (src, src_size);
+
+  return dst;
+}
+
+size_t
+__mpx_wrapper_strlen (const char *s)
+{
+  size_t length = strlen (s);
+  __bnd_chk_ptr_bounds (s, length);
+  return length;
+}