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