Bug 27097 - Не зануляется выделенное malloc-ом
Summary: Не зануляется выделенное malloc-ом
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: gcc4.5 (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Sergey Bolshakov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 21801
  Show dependency tree
 
Reported: 2012-03-19 19:19 MSK by Sergey V Turchin
Modified: 2012-03-21 14:49 MSK (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey V Turchin 2012-03-19 19:19:16 MSK
Как показал дисассемблер, при сборке под 32-битную систему, компилятор не
правильно оптимизирует этот участок кода
(org_herac_tuxguitar_player_impl_midiport_alsa_MidiSystem.c):
JNIEXPORT jlong JNICALL
Java_org_herac_tuxguitar_player_impl_midiport_alsa_MidiSystem_malloc(JNIEnv*
env, jobject obj)
{
    jlong ptr = 0;

    handle_t *handle = (handle_t *) malloc( sizeof(handle_t) );
    handle->seq = NULL;
    handle->address = NULL;

    memcpy(&ptr, &handle, sizeof( handle ));

    return ptr;
}

Не зануляются handle->seq и handle->address

Тимур предлагает вот такой патч, но локально для прогрраммы:
http://git.altlinux.org/people/timonbl4/packages/?p=tuxguitar.git;a=commitdiff;h=0b9ef63575b28cf1b03d043a4904de944fb28ea1

Подробности в http://bugs.altlinux.org/21801
Comment 1 Dmitry V. Levin 2012-03-19 19:22:12 MSK
А почему gcc4.3 а не gcc4.5?
Comment 2 Sergey V Turchin 2012-03-20 14:38:13 MSK
(В ответ на комментарий №1)
> А почему gcc4.3 а не gcc4.5?
Промахнулся
Comment 3 Dmitry V. Levin 2012-03-20 14:56:15 MSK
(In reply to comment #0)
> Как показал дисассемблер, при сборке под 32-битную систему, компилятор не
> правильно оптимизирует этот участок кода
> (org_herac_tuxguitar_player_impl_midiport_alsa_MidiSystem.c):
> JNIEXPORT jlong JNICALL
> Java_org_herac_tuxguitar_player_impl_midiport_alsa_MidiSystem_malloc(JNIEnv*
> env, jobject obj)
> {
>     jlong ptr = 0;
> 
>     handle_t *handle = (handle_t *) malloc( sizeof(handle_t) );
>     handle->seq = NULL;
>     handle->address = NULL;
> 
>     memcpy(&ptr, &handle, sizeof( handle ));
> 
>     return ptr;
> }
> 
> Не зануляются handle->seq и handle->address

Не верю, чтобы компилятор это соптимизировал.  Что вам показал дизассемблер?

P.S. Почему они не используют calloc?
Comment 4 Dmitry V. Levin 2012-03-20 15:06:31 MSK
Это вообще должна была быть 1-строчная функция:

return (jlong) calloc(1, sizeof(handle_t));

Терять время на изучение аномалий в чужом бредовом коде нет никакого желания.
Comment 5 Mikhail Efremov 2012-03-21 11:34:47 MSK
(В ответ на комментарий №4)
> Это вообще должна была быть 1-строчная функция:
> 
> return (jlong) calloc(1, sizeof(handle_t));

Неа. Там возвращается адрес локальной переменной. Что хотели сказать этим авторы неизвестно, читать этот код действительно нет желания.
Comment 6 timonbl4@altlinux.org 2012-03-21 12:26:07 MSK
(In reply to comment #4)
> Это вообще должна была быть 1-строчная функция:
> 
> return (jlong) calloc(1, sizeof(handle_t));

Так работать не будет на 32 битной системе, т.к. jlong всегда 64 битная
Comment 7 Dmitry V. Levin 2012-03-21 14:18:16 MSK
(In reply to comment #6)
> (In reply to comment #4)
> > Это вообще должна была быть 1-строчная функция:
> > 
> > return (jlong) calloc(1, sizeof(handle_t));
> 
> Так работать не будет на 32 битной системе, т.к. jlong всегда 64 битная

Очего же не будет, еще как будет.
Comment 8 Mikhail Efremov 2012-03-21 14:49:31 MSK
(В ответ на комментарий №5)
> Неа. Там возвращается адрес локальной переменной.

Не надо читать багзиллу по утрам. Сморозил чушь, забудьте.