snu-sf-class / swpp202401

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

[Project] Skeleton Compiler segfault #63

Open sbkim28 opened 6 months ago

sbkim28 commented 6 months ago

안녕하세요, 특정 소스코드를 컴파일할 때, Segmentation fault가 발생하는 현상을 확인하여 제보하고자 합니다.

다음의 c 코드를 제공해주신 skeleton compiler로 컴파일하면 segmentation fault가 발생합니다.

#include <stdint.h>
#include <stdlib.h>

int64_t read();
void write(int64_t);

extern uint64_t *root, n1, n2, n3;

uint64_t foo() {
  uint64_t *cur = root;
  while (1) {
    if (cur == NULL)
      return 0;
    uint64_t v = *cur;
    uint64_t* c1 = (uint64_t*)*(cur + 1);
    uint64_t* c2 = (uint64_t*)*(cur + 2);

    if (n1) {
      cur = c1;
      continue;
    }
    if (n2) {
      cur = c2;
      continue;
    }
    if (!c1) {
      return 1;
    }

    if (!c2) {
      return 1;
    }
    cur = 0;
  }
}

int main() {
  root = 0;
  n1 = n2 = n3 = 0;
}

register_allocate 부분에서 문제가 발생하는 것 같습니다. 디버거를 이용해 확인해보니, 포인터 타입의 Phi Node에서 llvm::dyn_cast<llvm::IntegerType>(type)이 null이 되어 문제가 발생하는 것으로 추정됩니다.

  llvm::Value *v = phi->getIncomingValue(i);
  llvm::Type *type = v->getType();
  if (!type->isIntegerTy())
    v = llvm::CastInst::CreateBitOrPointerCast(v, Int64Ty, "", t);

  const auto cst_1 = CM->resolve_constant(
      I->getFunction(), llvm::dyn_cast<llvm::IntegerType>(type), 1, I);

해당 문제에 대해서 확인해주셨으면 합니다. 감사합니다.

strikef commented 6 months ago

const 중복 emit 방지를 위한 constant resolution 과정에서 포인터에 상수가 들어가는 경우를 제대로 처리하지 못해 발생하는 문제로 보입니다. 버그가 맞으며 수정될 예정입니다.

strikef commented 6 months ago

5/9일자 백엔드 패치에서 수정되었습니다.