Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Mar 2015 21:59:43 +0800
From:      Erich Dollansky <erich@alogt.com>
To:        "Molly (Dev Lists)" <mollydevlists@icloud.com>
Cc:        freebsd-arm@freebsd.org
Subject:   Re: pthread_create() munging malloc()ed memory?  (malloc(), threads, and static linking)  [RPI-B+, 10.1]
Message-ID:  <20150318215943.54fff5b7@B85M-HD3-0.alogt.com>
In-Reply-To: <6580F1DF-3A9F-42C1-A27F-75546FD73829@icloud.com>
References:  <6580F1DF-3A9F-42C1-A27F-75546FD73829@icloud.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

I was playing around a bit more. It crashes now also after the third
thread is created without a join but with a detach.

It seems to be all very random but once it crashes, it always crashes.

Erich


On Tue, 17 Mar 2015
23:31:52 -0500 "Molly (Dev Lists)" <mollydevlists@icloud.com> wrote:

> I'm encountering some strange behavior where memory passed as an
> argument through pthread_create() is getting zeroed out, under
> suspiciously specific conditions; but I haven't figured out the
> cause.  I've reduced it down to a pretty tiny test case (below)....
> 
> Summary:
>     * Main thread allocates a block of memory and sets the first
>       four bytes to some non-zero value (it doesn't matter what)
>     * The block is passed to a new thread via pthread_create();
>       the main thread then waits on that thread via pthread_join()
>     * In the thread, the value is printed, the block is free()d,
>       and the thread exits
> 
> After a few iterations of this (in a loop in main()), those "non-zero"
> bytes become zeroed out during the call to pthread_create().  This
> only occurs a couple of times, and then the behavior seems to return
> to normal for subsequent calls.
> 
> This only occurs under specific conditions:
>     * The size of the allocated block must be at least 68 bytes
>       and no more than 80 bytes
>     * The block needs to be allocated in the main thread and free()d
>       in the created thread
>     * The program must be statically linked (-static)
> 
> This seems bizarrely specific and makes me think that either I'm doing
> something wrong and wrecking memory somewhere, or I'm relying on
> fragile behavior and don't realize it; I'm not sure what it might be,
> though. (It seems like maybe the allocator isn't happy with threads,
> at least when statically linked; is something going on here that I'm
> missing?)
> 
> Any ideas/suggestions?
> 
> 
> This is running on a Raspberry Pi B+ using the 10.1-RELEASE image
> (FreeBSD 10.1-RELEASE #0 r274401).  clang is version 3.4.1 (the
> version included in the base system).
> 
> 
> //
> // Build with:  cc -std=c11 -Weverything -pthread -static thisfile.c
> //
> #include <pthread.h>
> #include <stdlib.h>
> #include <stdio.h>
> 
> 
> // Problem occurs if sizeof(TESTITEM) is in the range [68, 80]
> typedef struct
>     {
>     int  testval;
>     char padding [ 68 - sizeof ( int ) ];
>     }   TESTITEM;
> 
> 
> static void * thread_test ( void * arg )
> {
> fprintf ( stderr, "Value in thread: %d\n", ((TESTITEM*)arg)->testval
> ); free ( arg );
> return NULL;
> }
> 
> 
> int main ( int argc, char *argv[] )
> {
> (void)argc; // Unused
> (void)argv; // Unused
> for ( int i = 0; i < 10; i++ )
>     {
>     TESTITEM * p = malloc ( sizeof ( TESTITEM ) );
>     if ( p == NULL ) abort ();
> 
>     p->testval = 12345; // Any non-zero value is fine here
> 
>     pthread_t tid;
>     if ( pthread_create ( &tid, NULL, thread_test, p ) != 0 ) abort
> (); pthread_join ( tid, NULL );
>     }
> return 0;
> }
> _______________________________________________
> freebsd-arm@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arm
> To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150318215943.54fff5b7>