Home | History | Annotate | Download | only in drd
      1 /* -*- mode: C; c-basic-offset: 3; -*- */
      2 
      3 /*--------------------------------------------------------------------*/
      4 /*--- Replacements for strlen() and strnlen(), which run on the    ---*/
      5 /*--- simulated CPU.                                               ---*/
      6 /*--------------------------------------------------------------------*/
      7 
      8 /*
      9   This file is part of DRD, a heavyweight Valgrind tool for
     10   detecting threading errors. The code below has been extracted
     11   from memchec/mc_replace_strmem.c, which has the following copyright
     12   notice:
     13 
     14   Copyright (C) 2000-2010 Julian Seward
     15   jseward (at) acm.org
     16 
     17   This program is free software; you can redistribute it and/or
     18   modify it under the terms of the GNU General Public License as
     19   published by the Free Software Foundation; either version 2 of the
     20   License, or (at your option) any later version.
     21 
     22   This program is distributed in the hope that it will be useful, but
     23   WITHOUT ANY WARRANTY; without even the implied warranty of
     24   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     25   General Public License for more details.
     26 
     27   You should have received a copy of the GNU General Public License
     28   along with this program; if not, write to the Free Software
     29   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     30   02111-1307, USA.
     31 
     32   The GNU General Public License is contained in the file COPYING.
     33 */
     34 
     35 #include "pub_tool_basics.h"
     36 #include "pub_tool_hashtable.h"
     37 #include "pub_tool_redir.h"
     38 #include "pub_tool_tooliface.h"
     39 #include "valgrind.h"
     40 
     41 
     42 #define STRNLEN(soname, fnname)                                         \
     43    SizeT VG_REPLACE_FUNCTION_ZU(soname,fnname) ( const char* str, SizeT n ); \
     44    SizeT VG_REPLACE_FUNCTION_ZU(soname,fnname) ( const char* str, SizeT n ) \
     45    {                                                                    \
     46       SizeT i = 0;                                                      \
     47       while (i < n && str[i] != 0) i++;                                 \
     48       return i;                                                         \
     49    }
     50 
     51 STRNLEN(VG_Z_LIBC_SONAME, strnlen)
     52 
     53 
     54 // Note that this replacement often doesn't get used because gcc inlines
     55 // calls to strlen() with its own built-in version.  This can be very
     56 // confusing if you aren't expecting it.  Other small functions in this file
     57 // may also be inline by gcc.
     58 #define STRLEN(soname, fnname)                                          \
     59    SizeT VG_REPLACE_FUNCTION_ZU(soname,fnname)( const char* str );      \
     60    SizeT VG_REPLACE_FUNCTION_ZU(soname,fnname)( const char* str )       \
     61    {                                                                    \
     62       SizeT i = 0;                                                      \
     63       while (str[i] != 0) i++;                                          \
     64       return i;                                                         \
     65    }
     66 
     67 STRLEN(VG_Z_LIBC_SONAME,          strlen)
     68 #if defined(VGO_linux)
     69 STRLEN(VG_Z_LD_LINUX_SO_2,        strlen)
     70 STRLEN(VG_Z_LD_LINUX_X86_64_SO_2, strlen)
     71 #endif
     72 
     73 /*--------------------------------------------------------------------*/
     74 /*--- end                                                          ---*/
     75 /*--------------------------------------------------------------------*/
     76