<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/58023>58023</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [ASan] sem_timedwait hangs with 32-bit binary
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mpolacek
      </td>
    </tr>
</table>

<pre>
    The following program hangs with -m32, but not without:

`$ clang -m32 -fsanitize=address -lpthread sem_timedwait.c; ./a.out`

(and therefore the same happens with gcc)

```
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <semaphore.h>

typedef struct {
    unsigned int start;
    unsigned int count;
    unsigned int other;
    unsigned int iter;
} threadlocal_t;

threadlocal_t data_one __attribute__((aligned(64))) = { 0, 0, 0, 0 };
threadlocal_t data_two __attribute__((aligned(64))) = { 0, 0, 0, 0 };

sem_t sem_one;
sem_t sem_two;

void *thread_func_one(void *arg)
{
    int n;
    unsigned int other;
    struct timespec timeout;
    struct timespec sleeptime;
    
    timeout.tv_sec  = 0;
    timeout.tv_nsec = 1000;
    
    sleeptime.tv_sec  = 1;
    sleeptime.tv_nsec = 0;

    for ( n = 1; n < 10 ; n++ ) {
        while ( 0 != sem_timedwait(&sem_one,&timeout) );
        //sem_wait(&sem_one);
        printf("%s loop %i\n",__FUNCTION__,n);
        data_one.count = 0;
        nanosleep(&sleeptime,0);
        sem_post(&sem_two);
    }

    printf("%s done\n",__FUNCTION__);
    return 0;
}

void *thread_func_two(void *arg)
{
    int n;
    unsigned int other;
    struct timespec timeout;
    struct timespec sleeptime;
    
    
    timeout.tv_sec  = 0;
    timeout.tv_nsec = 1000;
    
    sleeptime.tv_sec  = 1;
    sleeptime.tv_nsec = 0;

    for ( n = 1; n < 10 ; n++ ) {
        while ( 0 != sem_timedwait(&sem_two,&timeout) );
        //sem_wait(&sem_two);
        printf("%s loop %i\n",__FUNCTION__,n);
        data_one.count = 0;
        nanosleep(&sleeptime,0);
        sem_post(&sem_one);
    }

    printf("%s done\n",__FUNCTION__);
   
    return 0;
}

int create_thread(int policy,int priority,void *(*start_routine)(void*),pthread_t *tidp)
{

    int retval = 1;
    
    pthread_attr_t attr;
    struct sched_param sched_param;

    if ( retval )
    {
        if ( 0 != ( errno = pthread_attr_init(&attr)) )
        {
            perror("Error: pthread_attr_init failed");
            retval = 0;
        }
    }


    if ( retval )
    {
        if ( 0 != ( errno = pthread_attr_setschedpolicy(&attr,policy)) )
        {
            perror("Error:pthread_attr_setschedpolicy failed");
            retval = 0;
        }
    }

    
    if ( retval )
    {
        
        if ( 0 != ( errno = pthread_attr_getschedparam(&attr,&sched_param)) )
        {
            perror("Error:pthread_attr_getschedparam failed");
            retval = 0;
        }
    }

    
    if ( retval )
    {
        sched_param.sched_priority = priority;
        
        if ( 0 != (errno = pthread_attr_setschedparam(&attr,&sched_param)) )
        {
            perror("Error:pthread_attr_setschedparam failed");
            retval = 0;
        }
    }

    
    if ( 0 != ( errno = pthread_create(tidp,&attr,start_routine,0)) )
    {
        perror("Error: pthread_create failed");
        retval = 0;
    }

    if ( retval )
    {
        if ( 0 != ( errno = pthread_attr_destroy(&attr)) )
        {
            perror("Error:pthread_attr_destroy failed");
            retval = 0;
        }
    }
    return retval;
}

int main(int argc, char *argv[])
{
    int retval[2] = { 1,1 };
    pthread_t tid[2];
    void *status;

    sem_init(&sem_one,0,1);
    sem_init(&sem_two,0,0);

    if ( retval[0] )
    {
        retval[0] = create_thread(SCHED_FIFO,84,thread_func_one,&tid[0]);
    }
    
    if ( retval[1] )
    {
        retval[1] = create_thread(SCHED_FIFO,84,thread_func_two,&tid[1]);
    }
    
    if ( retval[0] )
    {
        if ( 0 != ( errno = pthread_join(tid[0],&status)) )
        {
            perror("Error: pthread_join failed");
            retval[0] = 0;
        }
    }

    if ( retval[1] )
    {
        if ( 0 != ( errno = pthread_join(tid[1],&status)) )
        {
            perror("Error: pthread_join failed");
            retval[1] = 0;
        }
    }

    
    printf ("data_one.count=%d data_one.other=%d\n",data_one.count,data_one.other);
    printf ("data_two.count=%d data_two.other=%d\n",data_two.count,data_two.other);
    return retval[0]&retval[1]?0:1;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWUtz4jgQ_jXmogrlFwQOHBIYaucyc5jZs0tYMtaskVySnBT767cl2_hNEibZnalaijK21Opuff211DIHQc6b7ylFicgy8cz4EeVSHCU-oRTzo0LPTKfo7hT4jr9Fh0IjLrRtFIV2ggfH3TlufV26jh-iOIOBdgi6SxTmTLO_qRPsMCGSKoXuslynkmKCFD1Fmp0oecZMz2MneERzx9_judENytq6_RXmBOmUSpoISc0dUvhEwc08p7xy9BjHjr_uO1V-Kz0B43FWEIqcYKs0YWKeOsGnsV4qJZ_urSYx2a_OCuaizzlVkzIFZ-DCZLfBZlo_PeE8BSjaEvZqbBKaIKVlEWvk3D-W7Qg-BVfsyClBjGsQwBKCONUdi4Jf6RYmGNPdTLd6nfsdKvHKRIyzqFFbudzuQwRrHAlOURRhrSUD2tEoAgoYFmTWBNwtQxNq-wU8dmaeyDUsbV2gcXcxNWJEP4t3NlJeLbMtv2Eal76mFez2RjwJRpDjV05GScFjO9Zf1T1YHhtut2Nq0OZviVNFDEMvldPY3th0viKjMkpz89SRau4qHXP9FCkQt2C5HdmWBDciRsJzXXdC4cVgR6XXdbItc1Hq9qA1krBmAIYrxC9a7O0WPED2wfEf4YtsnNvgms9zyjJqh4Ow7xkNnaXLkmZZR9vfwkMNqVEHQQt6GmFlgK8ZMTJ-KJ5LCGRixWAdXiiUCZGDkgVzFltuG7dRtP_zy_b7569fDItN61BPnVhzm9ojMTIfjrmwwFZuXQLvb90xpcbvXKjWLAy7e4ImRXohGUyKmNlPzKerTVJdSN4OdFf9WDJZp36TZPo_rbppYWP3E2k1QsjfMK1GFod3TavX55etDiC1YMcsUwzMmbZcZCw-gxX7IJmQTJvHOuusVw-27IgkxJGVMyrT0vbDQ11ZwVZpUpiRfJip3XwFd59wNkLkFiqVTrPVg2LzM5ahKk4piXJs6t_W_QjzWWKZW5uuPSyD0gtlJXthuXmwxaV1ueMa4zVvrYtV4dHWPmrBThFUClkG_pO9DR6GylGCIeuIJcOQdFXwazSHLL4QYYR9Hw6OotoGpaZZA9O2bvpJvK6Y-0DgulR9C3g3Q3ms52bp3UbSLDYt5r8roh2rvySgranPq_tqGSsxrNe0gTcvBeIlSv-rcVD_ZRxeoGe5r0BfufJvG0R6-0a5bfZBGQBydVksjV1HYHL2I5P9oIWPUNifxPkdN4Yx9R9ChGqYKSfK0ddqihNmvColoECPzek6TrGsCvYnZ_HoLHbTdXtlYPHog9jluO6BGq9zRregXIoM4Fk1pCNQ1yzAOl2okQrAlGTNdt2c_sxLAa-P4FC4rGndfvk3wSXw0LWTukqpniwA0K_Svm3_-LSL9p_3X8HwKoTL4IVDWWeTSstkxTma2xcHvDc4693mbOtQQCotNzr7CmRfl6w_hOVvGz27jpcUerdizph5bbK2yfD2xfuGsN6AlPerIOXdjlT_AIZKj7pHQ1ANRzLSHBir1wm2tTmj9Qa1Gkr53jSGBiE1Rgya1isGm0GthlGD3fW8ZvqyA6MT7AHEB29kua_fyM_oxlsuQ38drsJwRjYBWQdrPNNMZ3QDah6-YW4C0nkp0P5bIvDvDtByYBzL86yQ2SbVOlfmbwn7IuAIQsUBJgXl0z7Lnuqfu1yKHzSGie6ZUgU1L-oXK9cPZulmvVq5YUAXCV2SA3bvk2TlJ36YHMghIeFiOcvwgWZqU-5FM7bxXd931_69t3Tv_XC-IEsarnEAsrHnUs8JXQrbWjY3hudCHmdyY304FEcFnRlTWjWdWNmXTbTWjwudCrk5wRkEx_SvmfV3Y539B40R-m4">