int와 long long에 따른 malloc memory corrupt

익명 사용자의 이미지

안녕하세요

복잡한 것도 아니고, 동생이 공부하는 걸 도와주다가 원인을 모르는 메모리 오염이 발생했다하여 질문드리고 싶습니다.

#include <stdio.h>
#include <stdlib.h>
 
#define divider 100007
 
int main()
{
	int k, n, idx;
	long long *arr;
	scanf("%d %d", &k, &n);
 
	arr = (long long*)malloc(sizeof(long long) * n);
 
	for(idx = 0; idx < k; idx++)
		scanf("%lld", &arr[idx]);
 
	arr[k] = 0;
	for(idx = 0; idx < k; idx++)
		arr[k] += arr[idx];
 
	for(idx = k + 1; idx < n; idx++)
		arr[idx] = (2 * arr[idx - 1] - arr[idx - k - 1] + divider) % divider;
 
	printf("%lld", arr[n - 1]);
 
	return 0;
}

이 상태에서 long long으로 선언된 부분들을 int로 바꾸면 정상적으로 작동합니다만
지금 상태로도 딱히 메모리에 대하여 버그가 있어보이진 않다고 생각했습니다.

컴파일러에 따라 long long의 크기는 8바이트, long long*의 크기는 4바이트이기에 sizeof(long long*)에서 sizeof(long long)으로 바꾸어도 해결되질 않습니다.

막무가내로 sizeof(long long) * n * 2 라는 크기로 할당해주면 문제가 없어보이니 오버플로우인 것 같습니다.

for(idx = k + 1; idx < n; idx++)
    arr[idx] = (2 * arr[idx - 1] - arr[idx - k - 1] + divider) % divider;

라는 부분만 지우면 정상적으로 작동하니 이 부분이 문제인 것 같습니다.

정말로 문제가 일어날 이유가 없어보이는데,

Main: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

라는 오류를 계속 뿜뿜하니 도무지 이유를 모르겠습니다.

참고로 이 코드가 다루는 문제는
https://codeup.kr/problem.php?id=2768
이고, 해당 코드가 내놓는 오류도 이 사이트에서 채점하는 결과로 나온 것입니다.

제 환경에서는 sizeof(long long*)을 sizeof(long long)으로 바꿔주기만해도 오류가 안 나긴합니다만...ㅠㅠ

jick의 이미지

무슨 값이 들어오는지는 모르지만, 중간에 arr[k]가 있으니 k는 n보다 반드시 작아야 하고 같거나 더 크면 안되겠군요.

...그 외에는 딱히 문제될 부분은 없는 것 같습니다.