라이브러리 빌드 툴을 CMake에서 Autotools로 바꾸는 과정에서
유닛 테스트를 잘못 만들었다는 걸 깨닫고 새로 작성함
문제는 Linux에서 GCC랑 Clang으로 테스트하면 잘 동작하는데,
macOS에서 Apple Clang으로 테스트하면 bplus_insert_even_test라는 테스트 하나만 실패함
tests/bplustree_test.c 105번 라인의 ASSERT_NULL이 실패했다고 나오는데, 왜 macOS에서만 이러는지 모르겠음... -_-;
현상 재구현 방법
git clone https://github.com/9rum/libindex.git
cd libindex/
autoreconf --install
./configure
make check
* 추가)
macOS에서 Clang으로 컴파일하면 성공하고 GCC로 컴파일할 때 실패하는데, gcc --version 쳐보면 Apple Clang으로 나옴
clang 바이너리 복붙한 거 같은데 왜 이런 결과가 나오는지는 모르겠음...
* 추가2)
macOS에서 Homebrew GCC로 테스트해봐도 정상적으로 수행되는 거 확인
원하는 걸 하려면 bplus_erase에 *list = NULL 넣어야 하지 않아?
리눅스에서는 잘 되는 거 보니 logical한 문제는 아닌 거 같음... lib/bplustree.c 246번 라인 보면 삭제하고나서 트리가 비면 *list = NULL을 해줌
시간 나면 디스어셈블리 해볼게
감사합니다 센세 (__)
여러번 돌려보면 될때도 있고 안 될때도 있는데 lib/bplustree.c 246번에 *list = NULL문이 stack이 NULL이 아니라서 넘어가버림
로직을 다시 체크해 봤는데 그럴 수가 없긴 한데... 일단 문제가 생긴 코드는 메모리 해제하기 위한 부분이라 어차피 clear라는 함수로 바뀔 예정이니 넘어가야 겠네용
와 근데 진짜 여러 번 하니까 될 때가 있네요 ㅇㅂㅇ;;
malloc이 실패하거나 realloc한 부분이라도 있나
malloc이 저렇게 자주 실패하지는 않을 거 같고... stack이 null이려면 index tree가 없었다는 거니까 walk가 null이어야지용
bplustre.c에 erase부분 마지막에 walk->nmemb일때 walk->type이 NULL이 아닐때 walk->children[0]을 반환하는데 여기가 문제
index tree의 height가 줄어드는 부분인데, root가 leaf이면 (노드 1개 밖에 없는 트리였으면) 트리를 삭제하고 그렇지 않으면 자식 노드로 옮기는 거라서 문제가 없는 거 같슴다
bplus_erase에 tree를 넘기는데 NULL상태로 넘길때 상황에 따라 238번 로직 결과가 바뀜
bplustree.c 238번 라인이 *tree가 NULL인 상태일 때 결과 값이 일정하지가 않음
238번 라인은 삭제할 키가 트리에 없는 경우인데, index tree가 NULL인 것과 무관하지 않을까요 로직이 잘못된 거라면 다른 플랫폼에서 실행했을 때에도 틀리게 나와야 하는데, 유독 macOS에서 gcc로 할 때만 이러는 게 의문임다...
아... 집에 와서 해보는데 내가 맥을 쓰는 게 아니라 재현을 못하겠다. 맥이 아니라 그런지 clang 써도 정상적으로 나오네
바보
왜 autotools로 바꿈? - dc App
CMake가 넘 극혐이기 때문이예용
그렇다고 더 똥으로 바꾸면 어떡해요... - dc App
이제 빌드 툴은 더 이상 안바꾸는데스웅
ㅇㅇ - dc App
ㅇㅇ 말을 잘못 적어서 지웠음 walk이 *tree인데 *tree가 완전히 null이 안되는 부분이 있나봄?