안녕하십니까, 제공해주신 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으로 하여 실행하였더니, 다음과 같은 출력 결과가 나왔습니다.
Return 이전에 hash 값을 출력하는 부분에서 32bit 값이 아니라 64bit 값이 출력되고 있습니다. 해서, 해당 문제에 대해서 확인해주실 수 있는지 여쭙고자 합니다.
안녕하십니까, 제공해주신 skeleton compiler 상에서 miscompilation이 발생하는 것 같아서 문의를 드립니다.
다음 코드는 제공해주신 benchmark repository에 있는
jenkins_hash.c
에서,uint32_t jenkins_one_at_a_time_hash(...)
함수의 return 직전에 write로 hash를 출력하게 한 코드입니다.이떄, hash는 uint32_t type이므로, 출력 결과 역시 uint32_t 범위 내의 값이어야 한다고 생각했습니다. 그런데, 이 코드를 제공해주신 skeleton compiler로 컴파일 후 interpreter를 이용해서 benchmark repository의 jenkins_hash/test/input4.txt 파일을 input으로 하여 실행하였더니, 다음과 같은 출력 결과가 나왔습니다.
Return 이전에 hash 값을 출력하는 부분에서 32bit 값이 아니라 64bit 값이 출력되고 있습니다. 해서, 해당 문제에 대해서 확인해주실 수 있는지 여쭙고자 합니다.
감사합니다.