Comments on mudflap
Eyal Lebedinsky
eyal@eyal.emu.id.au
Wed Jun 9 14:03:00 GMT 2004
Doug Graham wrote:
> Frank Eigler suggested that I send this to the list. His comments
> follow mine.
[trimmed]
> One other minor thing. On the Fedora Core 1 Linux system that I'm
> using for testing (with GLIBC 2.3.2), I get a mudflap violation every
> time I use one of the ctype routines (isdigit, isupper, islower, etc.)
> I assume that's because there is some array in the library that is
> accessed by the ctype macros, but which hasn't been registered with
> the mudflap runtime. For the tests above, I've been using my own ctype
> replacement so as to avoid this problem.
>
> Regards,
> Doug.
>
> --------------------
>
> From: "Frank Ch. Eigler" <fche@redhat.com>
>
> Hi, Doug -
[trimmed]
> With respect to ctype, yes, these types of static arrays used by
> libc macros pose a problem. One solution would require adding a few
> autoconf-sensitive lines to mf-runtime.c to register these during
> initialization much as environment variables and std* FILE objects are.
>
> - FChE
The abovementioned patch should be simple, just add the last three
__mf_register call statements to this function in
gcc/libmudflap/mf-runtime.c.
Do include <ctype.h> somewhere at the top.
int
__wrap_main (int argc, char* argv[])
{
extern char **environ;
extern int main ();
static int been_here = 0;
if (__mf_opts.heur_std_data && ! been_here)
{
unsigned i;
been_here = 1;
__mf_register (argv, sizeof(char *)*(argc+1), __MF_TYPE_STATIC, "argv[]");
for (i=0; i<argc; i++)
{
unsigned j = strlen (argv[i]);
__mf_register (argv[i], j+1, __MF_TYPE_STATIC, "argv element");
}
for (i=0; ; i++)
{
char *e = environ[i];
unsigned j;
if (e == NULL) break;
j = strlen (environ[i]);
__mf_register (environ[i], j+1, __MF_TYPE_STATIC, "environ element");
}
__mf_register (environ, sizeof(char *)*(i+1), __MF_TYPE_STATIC, "environ[]");
__mf_register (& errno, sizeof (errno), __MF_TYPE_STATIC, "errno area");
__mf_register (stdin, sizeof (*stdin), __MF_TYPE_STATIC, "stdin");
__mf_register (stdout, sizeof (*stdout), __MF_TYPE_STATIC, "stdout");
__mf_register (stderr, sizeof (*stderr), __MF_TYPE_STATIC, "stderr");
/* ctype.h tables */
__mf_register (__ctype_b, sizeof (unsigned short int)*256,
__MF_TYPE_STATIC, "__ctype_b");
__mf_register (__ctype_tolower, sizeof (__int32_t)*256,
__MF_TYPE_STATIC, "__ctype_tolower");
__mf_register (__ctype_toupper, sizeof (__int32_t)*256,
__MF_TYPE_STATIC, "__ctype_toupper");
}
#ifdef PIC
return main (argc, argv, environ);
#else
return __real_main (argc, argv, environ);
#endif
}
--
--
Eyal Lebedinsky (eyal@eyal.emu.id.au) <http://samba.org/eyal/>
More information about the Gcc
mailing list