Информация об изменениях

Сообщение Re[4]: И снова пишем программы с ИИ от 25.02.2025 8:36

Изменено 25.02.2025 8:37 temnik

Re[4]: И снова пишем программы с ИИ
Здравствуйте, icezone, Вы писали:

I>Здравствуйте, falcoware, Вы писали:


F>>Dec 10, 2023 — Новый размер в байтах. Возвращаемое значение. realloc возвращает указатель void в перераспределенном (и, возможно, перемещенном) блоке памяти.


I>до этой строчки не дойдет, потому что он после ресайза еще и копирование запустил


I>и это не случайная ошибка — ими весь код усеян

I>хорошо что я это понимаю, а если бы это был незнакомый мне язык?

Мы же не знаем, что и как ты попросил ее сделать. Я попросил проанализировать Qwen этот код на ошибки, он среди прочего нашел такие —

Утечка памяти при ошибке realloc:
Если realloc возвращает NULL, старый массив result все еще остается доступным, но после вызова free(result) он удаляется.
Однако, если realloc успешен, адрес старого массива заменяется новым адресом, и старая память автоматически освобождается.
Чтобы избежать путаницы, можно сохранить старый адрес перед вызовом realloc:

float* temp = (float*)realloc(result, (end_index — start_index) * sizeof(float));
if (temp == NULL) {
printf("Memory reallocation failed.\n");
return NULL; // Старый массив остается нетронутым
}
filtered_result = temp;

Необходимость явного указания размера массива result:
В коде не указано, как определить размер массива result. Это может привести к проблемам, если start_index или end_index выходят за пределы массива.
Рекомендуется передавать размер массива как дополнительный параметр функции.

Использование realloc вместо malloc:
Если result был создан не с помощью malloc или calloc, а, например, как локальный массив, использование realloc может привести к ошибке.

Re[4]: И снова пишем программы с ИИ
Здравствуйте, icezone, Вы писали:

I>Здравствуйте, falcoware, Вы писали:


F>>Dec 10, 2023 — Новый размер в байтах. Возвращаемое значение. realloc возвращает указатель void в перераспределенном (и, возможно, перемещенном) блоке памяти.


I>до этой строчки не дойдет, потому что он после ресайза еще и копирование запустил


I>и это не случайная ошибка — ими весь код усеян

I>хорошо что я это понимаю, а если бы это был незнакомый мне язык?

Мы же не знаем, что и как ты попросил ее сделать. Я попросил проанализировать Qwen этот код на ошибки, она среди прочего нашла такие —

Утечка памяти при ошибке realloc:
Если realloc возвращает NULL, старый массив result все еще остается доступным, но после вызова free(result) он удаляется.
Однако, если realloc успешен, адрес старого массива заменяется новым адресом, и старая память автоматически освобождается.
Чтобы избежать путаницы, можно сохранить старый адрес перед вызовом realloc:

float* temp = (float*)realloc(result, (end_index — start_index) * sizeof(float));
if (temp == NULL) {
printf("Memory reallocation failed.\n");
return NULL; // Старый массив остается нетронутым
}
filtered_result = temp;

Необходимость явного указания размера массива result:
В коде не указано, как определить размер массива result. Это может привести к проблемам, если start_index или end_index выходят за пределы массива.
Рекомендуется передавать размер массива как дополнительный параметр функции.

Использование realloc вместо malloc:
Если result был создан не с помощью malloc или calloc, а, например, как локальный массив, использование realloc может привести к ошибке.