Date: Tue, 17 Mar 2015 23:31:52 -0500 From: "Molly (Dev Lists)" <mollydevlists@icloud.com> To: freebsd-arm@freebsd.org Subject: pthread_create() munging malloc()ed memory? (malloc(), threads, and static linking) [RPI-B+, 10.1] Message-ID: <6580F1DF-3A9F-42C1-A27F-75546FD73829@icloud.com>
next in thread | raw e-mail | index | archive | help
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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6580F1DF-3A9F-42C1-A27F-75546FD73829>