On Saturday 19 April 2008 09:31:12 Mark Glines wrote:
> Gcc emits the following warnings:
>
> ./lua.pmc: In function 'Parrot_Lua_nci_caller':
> ./lua.pmc:127: warning: passing argument 2 of 'strncmp' from incompatible
> pointer type ./lua.pmc:128: warning: passing argument 1 of
> 'string_cstring_free' from incompatible pointer type
>
> Looking at the code in question, I'd have to agree.
>
> 120 Parrot_Context_info info;
> 121 Parrot_block_DOD(INTERP);
> 122
> 123 if (Parrot_Context_get_info(INTERP, sub_ctx, &info)) {
> 124 STRING *retval = info.subname;
> 125
> 126 /* free the non-constant string, but not the
> constant one */ 127 if (strncmp("(unknown file)",
> info.file, 14) < 0) 128
> string_cstring_free(info.file);
> 129
> 130 Parrot_unblock_DOD(INTERP);
> 131 RETURN(STRING *retval);
>
>
> The problem is, info.file isn't a char*, its a STRING*. This means 2
> things: you can't call strncmp on it directly, and you can't free it
> like a char* string.
>
> Actually, this isn't just a warning. This bug causes crashes,
> resulting in almost ALL of the lua test failures on my list:
>
> Failed Test Stat Wstat Total Fail List of Failed
> ---------------------------------------------------------------------------
>---- lua/t/alarm.t 2 512 6 2 4 6
> lua/t/basic.t 12 3072 54 12 7 13-14 28-29 35 40-42 51 53-54
> lua/t/io.t 2 512 41 2 28 35
> lua/t/lfs.t 1 256 18 1 15
> lua/t/math.t 1 256 32 1 18
> lua/t/os.t 2 512 25 2 20 23
> lua/t/string.t 3 768 34 3 10-11 25
> lua/t/table.t 2 512 18 2 3-4
>
> os.t test 23 is something unrelated. The rest of them are caused by
> this bug. Glibc aborts with an error that looks like:
>
> *** glibc detected *** ./parrot: double free or corruption (out):
> 0x00002b4aed18ef00 ***
>
> I propose just removing this code entirely. The attached patch does
> so. The GC will clean it up, right? I'm hoping someone familiar with
> the internals can review this, to make sure I haven't just created a
> memory leak.
The patch is correct.
This is my fault; I changed Parrot_Context_get_info() in r26495 to avoid
this "should I free? should I not?" guessing, but somehow failed to update
the Lua PMCs with the results.
-- c