맨위로가기

제어 흐름 그래프

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

제어 흐름 그래프(CFG)는 프로그램의 제어 흐름을 나타내는 그래프로, 각 노드는 기본 블록을 나타낸다. 기본 블록은 분기 또는 점프 없이 순차적으로 실행되는 코드 시퀀스이다. CFG는 진입 블록과 종료 블록을 가지며, 간선은 제어 흐름의 점프를 나타낸다. CFG는 도달 가능성, 지배 관계, 루프 관리 등 다양한 개념을 포함하며, 컴파일러 최적화 및 분석에 활용된다. 특히, 백 엣지, 임계 엣지, 불가능 엣지, 이상 엣지 등 특수한 형태의 엣지가 존재하며, 루프 헤더와 루프 전 헤더는 루프 최적화에 사용된다. CFG는 축약 가능성, 루프 연결성, 절차 간 제어 흐름 그래프와 같은 추가적인 특징을 가질 수 있다.

더 읽어볼만한 페이지

  • 그래프의 응용 - 상태도 (오토마타 이론)
    상태도는 유한 오토마타 이론에서 시스템의 상태와 전이를 시각적으로 표현하는 유향 그래프이며, 무어 머신, 밀리 머신, 하렐 상태도 등 다양한 형태로 활용된다.
  • 그래프의 응용 - 케일리 그래프
    케일리 그래프는 군과 생성 집합이 주어졌을 때 군의 원소를 꼭짓점으로, 생성원을 변으로 나타내는 그래프로, 군의 구조를 시각적으로 표현하며 그래프 이론과 군론을 연결하는 도구이다.
  • 모델링 언어 - 차트
    차트는 통계 데이터를 점, 선, 도형 등으로 묘사하여 데이터의 규칙성, 경향 등을 시각적으로 제시하고 분석 방향을 제시하는 도표이며, 히스토그램, 막대그래프, 원그래프, 선 그래프 등이 흔히 사용된다.
  • 모델링 언어 - 순서도
    순서도는 컴퓨터 알고리즘이나 프로세스를 시각적으로 표현하는 도구로, 흐름 공정 차트에서 기원하여 컴퓨터 프로그래밍 분야에서 알고리즘을 설명하는 데 사용되며, 다양한 종류와 소프트웨어 도구가 존재한다.
제어 흐름 그래프
일반 정보
제어 흐름 그래프의 예시
제어 흐름 그래프의 예시
종류유향 그래프
분야컴파일러 디자인
발명가프랜시스 E. 앨런
그래프 구조
노드기본 블록
엣지제어 흐름
속성
진입점유일한 진입 노드
종료점유일한 종료 노드 (때로는)
비연결 그래프도달 불가능한 코드 포함 가능
순환루프 표현
활용
데이터 흐름 분석정적 프로그램 분석
테스트 커버리지테스트 케이스 생성
컴파일러 최적화코드 최적화

2. 정의

제어 흐름 그래프(CFG)는 그래프의 각 노드가 기본 블록을 나타내는 그래프이다. 기본 블록은 단일 진입점과 단일 종료점을 가지는 일련의 코드 시퀀스로, 블록 내에서 분기나 점프가 발생하지 않는다. 즉, 점프가 없는 코드의 직선 조각이며, 점프는 블록의 시작과 끝을 구분한다. 방향이 있는 간선은 제어 흐름의 점프를 나타낸다. 대부분의 경우, 특별히 지정된 두 개의 블록이 있는데, 제어 흐름이 들어가는 ''진입 블록''과 모든 제어 흐름이 나가는 ''종료 블록''이다.[3]

CFG는 적어도 개념적으로는 각 노드가 개별 명령어를 나타내는 프로그램의 전체 흐름 그래프에서 시작하여, 모든 간선 A→B에 대해 outdegree(A) > 1 또는 indegree(B) > 1 (또는 둘 다)를 만족하도록 간선 수축을 수행하여 얻을 수 있다. 즉, 소스가 단일 종료점을 갖고 대상이 단일 진입점을 갖는 모든 간선을 수축한다.[4]

2. 1. 기본 블록 (Basic Block)

제어 흐름 그래프(CFG)에서 그래프의 각 노드(node)는 기본 블록을 표현하는데, 이는 점프가 없는 코드의 직선 조각이다.[9] 점프는 블록의 시작과 끝을 구분한다. 방향성 엣지(edge)는 제어 흐름에서 점프를 나타낸다. 대부분의 경우, 흐름 그래프가 진입하는 엔트리 블록과 모든 제어 흐름이 나가는 종료 블록이라는 두 개의 특별히 고안된 블록이 있다.[9]

CFG의 구조 절차 때문에 (사소하지 않은 CFG에서) 모든 A→B 엣지는 다음과 같은 속성을 갖는다.

: outdegree(A) > 1 또는 indegree(B) > 1 (또는 둘 다).[9]

2. 2. 엣지 (Edge)

제어 흐름 그래프에서 엣지(간선)는 기본 블록 사이의 제어 흐름 이동, 즉 점프를 나타낸다. 대부분의 경우 제어 흐름이 시작되는 진입 블록과 모든 제어 흐름이 빠져나가는 종료 블록이라는 두 개의 특별한 블록이 존재한다.[3]

CFG의 구성 절차로 인해, 모든 엣지 A→B는 다음 속성을 갖는다.[4]

: outdegree(A) > 1 또는 indegree(B) > 1 (또는 둘 다).

몇 가지 종류의 엣지가 존재한다.

  • 백 엣지 (back edge): DFS 동안 이미 방문했던 블록을 가리키는 엣지이다. 백 엣지는 루프를 나타내는 대표적인 엣지이다.
  • 임계 엣지 (critical edge): 소스 블록에서 나가는 유일한 엣지도 아니고, 목적 블록으로 들어오는 유일한 엣지도 아닌 엣지이다. 이러한 엣지는 '분할'되어야 한다. 즉, 다른 엣지에 영향을 주지 않고 엣지에 대한 계산을 삽입하기 위해 엣지 중간에 새 블록을 생성해야 한다.
  • 불가능한 엣지 (impossible edge 또는 fake edge): 종료 블록이 모든 블록을 후지배(postdominate)하는 속성을 보존하기 위해 단독으로 추가된 엣지이다. 이 엣지로는 제어 흐름이 이동할 수 없다.

2. 3. 진입 블록 (Entry Block)과 종료 블록 (Exit Block)

제어 흐름 그래프(CFG)에서 그래프의 각 노드는 기본 블록을 나타낸다. 기본 블록은 점프가 없는 코드의 직선 조각으로, 점프는 블록의 시작과 끝을 구분한다. 방향성 간선은 제어 흐름에서 점프를 나타낸다. 대부분의 경우 특별히 지정된 두 개의 블록이 있는데, 제어 흐름이 들어가는 ''진입 블록''과 모든 제어 흐름이 나가는 ''종료 블록''이다.[3]

3. 예시

다음은 제어 흐름 그래프를 나타내는 코드 예시이다.

```

0: (A) t0 = read_num

1: (A) if t0 mod 2 == 0

2: (B) print t0 + " is even."

3: (B) goto 5

4: (C) print t0 + " is odd."

5: (D) end program

```

위 코드에는 4개의 기본 블록이 있다.


  • A: 0 ~ 1행
  • B: 2 ~ 3행
  • C: 4행
  • D: 5행


여기서 A는 진입 블록, D는 종료 블록이며, 4행과 5행은 점프 대상이다. 이 코드를 제어 흐름 그래프로 나타내면 A에서 B, A에서 C, B에서 D, C에서 D로 가는 4개의 엣지(edge)를 갖는다.[1]

4. 도달 가능성 (Reachability)

도달 가능성은 최적화에 유용한 그래프 속성이다.

하위 그래프가 시작 블록을 포함하는 하위 그래프와 연결되지 않으면, 해당 하위 그래프는 어떤 실행 중에도 도달할 수 없으므로 도달 불가능한 코드가 된다. 일반적인 상황에서는 안전하게 제거할 수 있다.

종료 블록이 시작 블록으로부터 도달할 수 없다면, 무한 루프가 존재할 수 있다. 모든 무한 루프를 감지할 수 있는 것은 아니며, 정지 문제를 참조하라. 정지 순서 또한 존재할 수 있다.

도달 불가능한 코드와 무한 루프는 프로그래머가 명시적으로 코딩하지 않더라도 발생할 수 있다. 상수 전파 및 상수 접기와 같은 최적화 다음에 점프 스레딩을 수행하면 여러 기본 블록을 하나로 병합하고, 제어 흐름 그래프(CFG)에서 가장자리를 제거하는 등의 작업을 수행하여 그래프의 일부를 분리할 수 있다.

5. 지배 관계 (Domination Relationship)

제어 흐름 그래프에서 사용되는 지배 관계 관련 용어는 다음과 같다.[1]


  • '''지배 노드(dominator):''' 블록 M이 블록 N을 지배한다는 것은, 블록 N으로 들어가는 모든 경로가 반드시 사전에 블록 M을 통과한다는 것을 의미한다. 진입 블록은 다른 모든 블록의 지배 노드이다.
  • '''후지배 노드(postdominator):''' 블록 N에서 출구 블록까지의 모든 경로에서 반드시 블록 M을 통과할 때, 블록 M을 후지배 노드라고 부른다. 출구 블록은 다른 모든 블록의 후지배 노드이다.


이 개념들은 하위 섹션에서 더 자세히 설명된다.

5. 1. 지배자 (Dominator)와 후지배자 (Postdominator)

어떤 블록 N에 도달하는 모든 경로가 블록 M을 거쳐야 한다면 블록 M은 블록 N을 지배한다. 반대로, 블록 N에서 종료까지의 모든 경로가 블록 M을 거쳐야 한다면, 블록 M은 블록 N을 후지배(postdominate)한다.

M은 시작점부터 N까지의 모든 경로에서 마지막 지배자라고 할 수 있다. 각 블록은 고유한 즉각적(immediate) 지배 관계를 갖는다.

즉각적 지배와 즉각적 후지배도 이와 비슷하게 정의된다.

지배자 트리(''dominator tree'')는 지배 관계를 나타내는 보조적인 데이터 구조이다. 블록 M이 블록 N을 즉각적으로 지배하면, 블록 M에서 블록 N으로 연결선(arc)이 생긴다. 각 블록은 고유한 즉각적 지배자를 가지므로 이 그래프는 트리가 된다. 이 트리는 시작 블록에서부터 뻗어나온다. Lengauer–Tarjan 알고리즘을 사용하면 효율적으로 계산할 수 있다.
후지배자 트리(postdominator tree)는 지배자 트리의 유사체이다. 이 트리는 종료 블록에서부터 뻗어나온다.

블록 M이 블록 N을 지배한다는 것은 블록 N에 도달하는 모든 경로가 블록 M을 거쳐야 함을 의미한다.[1] 시작 블록은 모든 블록을 지배한다.[1]

반대로, 블록 M이 블록 N을 ''사후 지배''한다는 것은 N에서 종료 지점까지의 모든 경로가 블록 M을 거쳐야 함을 의미한다.[1] 종료 블록은 모든 블록을 사후 지배한다.[1]

블록 M이 블록 N을 ''직접 지배''한다는 것은 M이 N을 지배하고, M과 N 사이에 M이 P를 지배하고 P가 N을 지배하는 중간 블록 P가 없는 경우를 말한다.[1] 즉, M은 시작점에서 N까지의 모든 경로에서 마지막 지배자이다.[1] 각 블록은 고유한 직접 지배자를 갖는다.[1]

''직접 사후 지배자''는 ''직접 지배자''와 유사한 개념이다.[1]

지배자 트리는 지배 관계를 나타내는 보조 데이터 구조이다.[1] M이 N의 직접 지배자인 경우 블록 M에서 블록 N으로 연결선이 존재한다.[1] 각 블록은 고유한 직접 지배자를 가지므로 이 그래프는 트리이다.[1] 이 트리는 시작 블록을 루트로 한다.[1] 지배자 트리는 Lengauer–Tarjan 알고리즘을 사용하여 효율적으로 계산할 수 있다.[1]

''사후 지배자 트리''는 ''지배자 트리''와 유사하다.[1] 이 트리는 종료 블록을 루트로 한다.[1]

5. 2. 직접 지배자 (Immediate Dominator)와 직접 후지배자 (Immediate Postdominator)

블록 M이 블록 N을 ''지배''한다는 것은 블록 N에 도달하는 모든 경로가 블록 M을 거쳐야 함을 의미한다. 시작 블록은 모든 블록을 지배한다.

반대 방향으로, 블록 M이 블록 N을 ''사후 지배''한다는 것은 N에서 종료 지점까지의 모든 경로가 블록 M을 거쳐야 함을 의미한다. 종료 블록은 모든 블록을 사후 지배한다.

블록 M이 블록 N을 ''직접 지배''한다는 것은 M이 N을 지배하고, M이 P를 지배하고 P가 N을 지배하는 중간 블록 P가 없는 경우를 말한다. 즉, M은 시작 지점에서 N까지의 모든 경로에서 마지막 지배자이다. 각 블록은 고유한 직접 지배자를 갖는다.

마찬가지로, ''직접 사후 지배자''라는 개념이 있으며, 이는 ''직접 지배자''와 유사하다.

지배자 트리는 지배 관계를 나타내는 보조 데이터 구조이다. M이 N의 직접 지배자인 경우 블록 M에서 블록 N으로의 아크가 존재한다. 각 블록은 고유한 직접 지배자를 가지므로 이 그래프는 트리이다. 이 트리는 시작 블록을 루트로 한다. 지배자 트리는 Lengauer–Tarjan 알고리즘을 사용하여 효율적으로 계산할 수 있다.

''사후 지배자 트리''는 ''지배자 트리''와 유사하다. 이 트리는 종료 블록을 루트로 한다.

; 직접 지배 노드(immediate dominator): 블록 M이 블록 N의 지배 노드이고, 그 중간 경로에 블록 N에게 지배 노드가 존재하지 않는 경우, 블록 M을 블록 N의 직접 지배 노드라고 한다. 어떤 블록에 지배 노드가 있는 경우, 직접 지배 노드는 유일하게 존재한다.

; 직접 후지배 노드(immediate postdominator): 직접 지배 노드와 동일한 개념.

; 지배 트리(dominator tree): 지배 관계만을 나타낸 보조적인 데이터 구조. 블록 M이 블록 N의 지배 노드인 경우, 블록 M에서 블록 N으로의 에지가 그려진다. 직접 지배 노드는 유일하므로, 이 그래프는 트리 구조가 된다. 루트는 진입 블록이다.

; 후지배 트리(postdominator tree): 지배 트리와 동일. 출구 블록이 루트가 된다.

5. 3. 지배자 트리 (Dominator Tree)와 후지배자 트리 (Postdominator Tree)

블록 M이 블록 N을 지배한다는 것은 블록 N에 도달하는 모든 경로가 블록 M을 거쳐야 함을 의미한다. 시작 블록은 모든 블록을 지배한다.

반대 방향으로, 블록 M이 블록 N을 ''사후 지배''한다는 것은 N에서 종료 지점까지의 모든 경로가 블록 M을 거쳐야 함을 의미한다. 종료 블록은 모든 블록을 사후 지배한다.

블록 M이 블록 N을 ''직접 지배''한다는 것은 M이 N을 지배하고, M이 P를 지배하고 P가 N을 지배하는 중간 블록 P가 없는 경우를 말한다. 즉, M은 시작 지점에서 N까지의 모든 경로에서 마지막 지배자이다. 각 블록은 고유한 직접 지배자를 갖는다.

마찬가지로, ''직접 사후 지배자''라는 개념이 있으며, 이는 ''직접 지배자''와 유사하다.

지배자 트리는 지배 관계를 나타내는 보조 데이터 구조이다. M이 N의 직접 지배자인 경우 블록 M에서 블록 N으로의 아크가 존재한다. 각 블록은 고유한 직접 지배자를 가지므로 이 그래프는 트리이다. 이 트리는 시작 블록을 루트로 한다. 지배자 트리는 Lengauer–Tarjan 알고리즘을 사용하여 효율적으로 계산할 수 있다.

''사후 지배자 트리''는 ''지배자 트리''와 유사하다. 이 트리는 종료 블록을 루트로 한다.

6. 특수 엣지 (Special Edges)

제어 흐름 그래프에서 사용되는 특수 엣지(Special Edges)에는 백 엣지, 임계 엣지, 불가능 엣지, 이상 엣지가 있다.


  • 백 엣지 (Back Edge): DFS 과정에서 이미 방문했던 블록을 가리키는 간선으로, 루프를 형성한다.[1] [2]
  • 임계 엣지 (Critical Edge): 소스 블록에서 나가는 유일한 엣지도 아니고, 목적 블록으로 들어오는 유일한 엣지도 아닌 엣지이다. 다른 엣지에 영향을 주지 않고 계산을 삽입하기 위해 엣지 중간에 새로운 블록을 생성하는 '분할'이 필요하다. [2]
  • 불가능 엣지 (Impossible Edge): 종료 블록이 모든 블록을 후지배(postdominate)하는 속성을 유지하기 위해 추가되는 엣지로, 실제로 통과할 수 없다.[1]
  • 이상 엣지 (Abnormal Edge): 목적지가 불분명한 엣지로, 예외 처리에 의해 생성될 수 있으며 최적화를 방해한다.[1]

6. 1. 백 엣지 (Back Edge)

백 엣지(''back edge'')는 DFS 동안 이미 만났던 블록을 가리키는 간선으로, 루프를 구성한다.[1] [2]

; 루프 헤더(loop header): 루프 구조의 진입 지점이 되는 블록. 루프를 구성하는 후진 에지가 가리키게 된다. 루프 본체를 구성하는 모든 블록의 지배 노드가 된다.[3]

6. 2. 임계 엣지 (Critical Edge)

임계 엣지(''critical edge'')는 소스 블록에서 유일하게 나가는 엣지도 아니고, 목적 블록으로 들어오는 유일한 엣지도 아닌 엣지이다. 이러한 엣지들은 '분할'되어야 한다. 즉, 다른 엣지에 영향을 주지 않고 계산을 엣지에 삽입하기 위해 엣지 중간에 새로운 블록을 생성해야 한다. [2]

6. 3. 불가능 엣지 (Impossible Edge)

불가능 엣지(impossible edge 또는 fake edge)는 종료 블록이 모든 블록을 후지배(postdominate)하는 속성을 보존하기 위해 단독으로 추가된 엣지이다. 이것은 영원히 지나갈 수 없다.[1]

6. 4. 이상 엣지 (Abnormal Edge)

'''이상 엣지'''는 목적지가 불분명한 엣지이다. 예외 처리에 의해 이러한 엣지가 생성될 수 있으며, 최적화를 방해하는 경향이 있다.[1]

7. 루프 관리 (Loop Management)

루프 헤더는 루프의 진입점 역할을 하며, 루프를 구성하는 백 엣지(back edge)가 가리키는 지배자이다. 루프 헤더는 루프 내 모든 블록을 지배한다. 하나의 블록이 여러 루프의 헤더가 될 수도 있고, 루프에 진입점이 여러 개여서 루프 헤더가 없는 경우도 있다.[1]

루프 최적화 과정에서 루프 헤더 M은 Mpre (루프 전 헤더)와 Mloop (루프 헤더)로 분할될 수 있다. M의 내용과 백 엣지는 Mloop로, 나머지 엣지는 Mpre로 이동하며, Mpre에서 Mloop로 새로운 엣지가 추가된다. Mpre는 초기에는 비어 있지만, 루프 불변 코드 이동과 같은 최적화를 통해 코드가 채워질 수 있다.

7. 1. 루프 헤더 (Loop Header)

루프 헤더(또는 루프의 진입점)는 루프를 형성하는 백 엣지의 대상이 되는 지배자이다. 루프 헤더는 루프 몸체의 모든 블록을 지배한다. 블록은 둘 이상의 루프에 대한 루프 헤더일 수 있다. 루프에 여러 진입점이 있을 수 있으며, 이 경우 루프 헤더가 없다.[1]

블록 M이 여러 개의 들어오는 엣지(일부 엣지는 백 엣지)를 가진 지배자라고 가정할 때(따라서 M은 루프 헤더임), M을 두 블록 Mpre와 Mloop으로 분할하는 것이 여러 최적화 패스에 유리하다. M의 내용과 백 엣지는 Mloop으로 이동하고, 나머지 엣지는 Mpre를 가리키도록 이동하며, Mpre에서 Mloop으로 가는 새로운 엣지가 삽입된다(따라서 Mpre는 Mloop의 직접적인 지배자임). 처음에 Mpre는 비어 있지만, 루프 불변 코드 이동과 같은 패스가 이를 채울 수 있다. Mpre는 루프 프리헤더라고 하며 Mloop는 루프 헤더가 된다.[1]

7. 2. 루프 전 헤더 (Loop Pre-header)

블록 M이 여러 개의 들어오는 엣지를 가진 지배자이고, 그중 일부는 백 엣지(즉, M은 루프 헤더)라고 가정한다. M을 두 개의 블록 Mpre와 Mloop로 나누는 것은 여러 최적화 과정에서 유리하다. M의 내용과 백 엣지는 Mloop로 이동하고, 나머지 엣지는 Mpre를 가리키도록 변경된다. 그리고 Mpre에서 Mloop로 가는 새로운 엣지가 추가된다(Mpre는 Mloop의 직접적인 지배자가 된다).

처음에 Mpre는 비어 있지만, 루프 불변 코드 이동과 같은 최적화 기법을 통해 코드가 추가될 수 있다. Mpre루프 전 헤더(loop pre-header)라고 불리며, Mloop는 루프 헤더가 된다.

8. 축약 가능성 (Reducibility)

제어 흐름 그래프(CFG)의 축약 가능성에 대해 설명하면 다음과 같다. 가변 CFG는 간선을 전방 간선과 후방 간선, 두 개의 분리된 집합으로 나눌 수 있으며, 다음 조건을 만족한다.[5]


  • 전방 간선은 시작 노드에서 도달 가능한 모든 노드로 구성된 방향 비순환 그래프를 형성한다.
  • 모든 후방 간선 (A, B)에 대해 노드 B는 노드 A를 지배한다.


구조적 프로그래밍 언어는 보통 생성하는 모든 CFG가 가변적이도록 설계되며, IF, FOR, WHILE, BREAK, CONTINUE와 같은 일반적인 구조적 프로그래밍 구문은 가변 그래프를 생성한다. 비가변 그래프를 생성하려면 GOTO와 같은 구문이 필요하다. 비가변 그래프는 일부 컴파일러 최적화에 의해 생성될 수도 있다.

9. 루프 연결성 (Loop Connectedness)

제어 흐름 그래프(CFG)의 루프 연결성은 주어진 깊이 우선 탐색 트리(DFST)를 기준으로 정의된다. 이 DFST는 시작 노드를 루트로 하고 CFG의 모든 노드를 포함해야 한다.

CFG에서 어떤 노드에서 그 노드의 DFST 조상(자기 자신 포함) 중 하나로 연결되는 에지를 백 에지라고 한다.

루프 연결성은 CFG에서 사이클이 없는 경로에서 발견되는 백 에지의 최대 개수이다. 축약 가능한 CFG에서 루프 연결성은 선택된 DFST에 관계없이 독립적이다.[6][7]

루프 연결성은 데이터 흐름 분석의 시간 복잡도를 추론하는 데 사용되었다.[6]

10. 절차 간 제어 흐름 그래프 (Inter-procedural Control-Flow Graph)

절차 간 제어 흐름 그래프는 전체 프로그램의 제어 흐름을 나타낸다는 점에서, 단일 프로시저의 제어 흐름을 나타내는 제어 흐름 그래프와 차이가 있다.[8]

참조

[1] 논문 Control flow analysis 1970-07
[2] 간행물 Applications of Boolean matrices to the analysis of flow diagrams
[3] 간행물 2015 5th International Conference on Computer and Knowledge Engineering (ICCKE) https://ieeexplore.i[...] IEEE 2015
[4] 서적 Engineering of Software: The Continuing Contributions of Leon J. Osterweil Springer Science & Business Media
[5] 웹사이트 Archived copy http://www.cs.colost[...] 2018-03-24
[6] 논문 Global Data Flow Analysis and Iterative Algorithms 1976-01-01
[7] 웹사이트 Notes on Graph Algorithms Used in Optimizing Compilers https://www.cs.umb.e[...] 2018-04-13
[8] 웹사이트 Control Flow Analysis http://web.cs.iastat[...] 2016
[9] 서적 Engineering of Software: The Continuing Contributions of Leon J. Osterweil Springer Science & Business Media



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com