
C/C++/Java/Binary/Javascript/Python/Kotlin을 위한 코드 속성 그래프 기반 오픈소스 코드 분석 플랫폼입니다. Discord https://discord.gg/vv4MH284Hc
이것은 오픈 소스 코드 분석 플랫폼 Joern의 중앙 쿼리 데이터베이스입니다. 두 가지 목적이 있습니다:
쿼리 데이터베이스는 Joern을 종속성으로 포함하는 독립형 라이브러리로 배포됩니다. 즉, 데이터베이스의 쿼리를 사용하기 위해 Joern을 설치할 필요가 없습니다.
동시에 데이터베이스는 Joern 확장입니다. 즉, 시작 시 동적으로 로드되면 그 기능이 대화형 Joern 셸 및 Joern 스크립트에서 사용 가능해집니다.
이 프로젝트를 포크하여 사용자 정의 쿼리 및 스캐너를 구축하거나 이 저장소에 PR을 보내 기본 배포에 포함을 고려하도록 할 수 있습니다.
설치 스크립트는 joern을 다운로드하여 하위 디렉토리에 설치합니다. 쿼리 데이터베이스는 확장으로 설치됩니다.
./install.sh
다음과 같이 모든 쿼리를 실행할 수 있습니다:
./joern-scan path/to/code
예를 들어,
mkdir foo
echo "int foo(int a, int b, int c, int d, int e, int f) {}" > foo/foo.c
./joern-scan foo
디렉토리 foo에 있는 샘플 코드에 대해 모든 쿼리를 실행하며, 함수 foo에 매개변수가 너무 많다고 판단합니다.
문제 없는 쿼리 작성을 위해 아래 규칙을 따르십시오:
io.joern.scanners의 쿼리는 런타임에 자동으로 인식되므로, 거기에 쿼리를 배치하십시오.@q로 시작해야 하며 쿼리 번들에 배치되어야 합니다. 쿼리 번들은 QueryBundle에서 파생된 object입니다.sbt scalafmt Test/scalafmt를 사용하여 코드 서식을 지정하십시오.예를 들어 src/main/scala/io/joern/scanners/c/Metrics.scala에 있는 쿼리 번들 Metrics를 살펴보십시오:
object Metrics extends QueryBundle {
@q
def tooManyParameters(n: Int = 4): Query =
Query.make(
name = "too-many-params",
author = Crew.fabs,
title = s"Number of parameters larger than $n",
description = s"This query identifies functions with more than $n formal parameters",
score = 1.0,
withStrRep({ cpg =>
cpg.method.internal.filter(_.parameter.size > n)
}),
tags = List(QueryTags.metrics)
)
@q
def tooHighComplexity(n: Int = 4): Query =
Query.make(
name = "too-high-complexity",
author = Crew.fabs,
title = s"Cyclomatic complexity higher than $n",
description = s"This query identifies functions with a cyclomatic complexity higher than $n",
score = 1.0,
withStrRep({ cpg =>
cpg.method.internal.filter(_.controlStructure.size > n)
}),
tags = List(QueryTags.metrics)
)
...
}
쿼리에 해당하는 테스트는 src/test/scala/io/joern/scanners에 있습니다. 예를 들어, 메트릭스 쿼리의 테스트는 src/test/scala/io/joern/scanners/c/MetricsTests.scala에 있습니다:
class MetricsTests extends Suite {
override val code = """
int too_many_params(int a, int b, int c, int d, int e) {
}
...
"""
"find functions with too many parameters" in {
Metrics.tooManyParameters(4)(cpg).map(_.evidence) match {
case List(List(method: nodes.Method)) =>
method.name shouldBe "too_many_params"
case _ => fail
}
}
...
}
이러한 테스트는 쿼리 개발 중 IntelliJ IDE에서 개별적으로 실행할 수 있습니다.
Scala Build Tool (sbt)를 사용합니다. sbt가 설치되어 있는지 확인하십시오. 버전은 중요하지 않습니다. sbt가 빌드 파일(build.sbt)을 기반으로 필요한 버전을 가져오기 때문입니다.
sbt가 설치되면 다음과 같이 데이터베이스를 빌드하고 테스트할 수 있습니다:
sbt test
새로 개발된 쿼리를 테스트할 수 있습니다
다음과 같이 joern-scan으로 새로 생성된 쿼리를 테스트하려면:
sbt joerncli/stage
./querydb-install.sh && ./joern-scan <src>
install.sh를 실행한 후 다음을 실행할 수 있습니다:
./joern-scan --dump
사용 가능한 모든 쿼리와 해당 메타 정보 목록이 포함된 querydb.json 파일을 생성합니다.