snu-sf-class / swpp202401

Principles and Practices of Software Development Main Repository
14 stars 4 forks source link

[Project] Skeleton compiler Miscompilation 관련 문의 #48

Open sbkim28 opened 7 months ago

sbkim28 commented 7 months ago

안녕하십니까, 제공해주신 skeleton compiler 상에서 miscompilation이 발생하는 것 같아서 문의를 드립니다.

다음 코드는 제공해주신 benchmark repository에 있는 jenkins_hash.c에서, uint32_t jenkins_one_at_a_time_hash(...) 함수의 return 직전에 write로 hash를 출력하게 한 코드입니다.

#include <inttypes.h>
#include <stdlib.h>

uint64_t read();
void write(uint64_t val);

void *malloc_upto_8(uint64_t x) { return malloc((x + 7) / 8 * 8); }

uint32_t jenkins_one_at_a_time_hash(uint32_t value, const uint8_t *key,
                                    size_t length) {
  size_t i = 0;
  uint32_t hash = value;
  while (i != length) {
    hash += key[i++];
    hash += hash << 10;
    hash ^= hash >> 6;
  }
  hash += hash << 3;
  hash ^= hash >> 11;
  hash += hash << 15;
  write(hash);
  return hash;
}

int main() {
  uint64_t n = read();
  if (n == 0) {
    write(0);
    return 0;
  }
  uint8_t *arr = (uint8_t *)malloc_upto_8(n);
  for (int i = 0; i < n; ++i)
    arr[i] = (uint8_t)read();

  uint32_t value = 0;
  for (int i = 0; i < 10; ++i)
    value = jenkins_one_at_a_time_hash(value, arr, n);

  write(value);

  free(arr);

  return 0;
}

이떄, hash는 uint32_t type이므로, 출력 결과 역시 uint32_t 범위 내의 값이어야 한다고 생각했습니다. 그런데, 이 코드를 제공해주신 skeleton compiler로 컴파일 후 interpreter를 이용해서 benchmark repository의 jenkins_hash/test/input4.txt 파일을 input으로 하여 실행하였더니, 다음과 같은 출력 결과가 나왔습니다.

image

Return 이전에 hash 값을 출력하는 부분에서 32bit 값이 아니라 64bit 값이 출력되고 있습니다. 해서, 해당 문제에 대해서 확인해주실 수 있는지 여쭙고자 합니다.

감사합니다.

strikef commented 7 months ago

컴파일러가 아닌 인터프리터 버그로 보입니다. 현재 수정 중이며, 업데이트되는 대로 다시 공지하겠습니다.

strikef commented 7 months ago

현재 버그를 수정한 버전을 인터프리터 리포지토리에 업데이트했습니다. 문제가 해결되었는지 확인이 가능하실까요?

sbkim28 commented 7 months ago

안녕하세요, 수정된 인터프리터로 실행했을 때, 해당 문제가 해결됨을 확인하였습니다. 빠르게 수정해주셔서 감사합니다.