
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 एनोटेशन से शुरू होनी चाहिए और एक क्वेरी बंडल में रखी जानी चाहिए। एक क्वेरी बंडल बस एक object है जो QueryBundle से व्युत्पन्न होता है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 बनाने के लिए जिसमें सभी उपलब्ध क्वेरी और उनकी मेटा जानकारी की सूची होती है।