Skip to content

Commit b05a1f4

Browse files
committed
C#: Support for type based model generation via python script.
1 parent 4e57b40 commit b05a1f4

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

misc/scripts/models-as-data/generate_flow_model.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ def __init__ (self, language):
1515
self.generateSources = False
1616
self.generateSummaries = False
1717
self.generateNegativeSummaries = False
18+
self.generateTypeBasedSummaries = False
1819
self.dryRun = False
1920

2021

2122
def printHelp(self):
2223
print(f"""Usage:
23-
python3 GenerateFlowModel.py <library-database> <outputQll> [<friendlyFrameworkName>] [--with-sinks] [--with-sources] [--with-summaries] [--dry-run]
24+
python3 GenerateFlowModel.py <library-database> <outputQll> [<friendlyFrameworkName>] [--with-sinks] [--with-sources] [--with-summaries] [--with-typebased-summaries] [--dry-run]
2425
2526
This generates summary, source and sink models for the code in the database.
2627
The files will be placed in `{self.language}/ql/lib/semmle/code/{self.language}/frameworks/<outputQll>` where
@@ -33,6 +34,7 @@ def printHelp(self):
3334
--with-sources
3435
--with-summaries
3536
--with-negative-summaries
37+
--with-typebased-summaries (Experimental - only for C#)
3638
If none of these flags are specified, all models are generated.
3739
3840
--dry-run: Only run the queries, but don't write to file.
@@ -62,6 +64,7 @@ def setenvironment(self, target, database, friendlyName):
6264
self.codeQlRoot, f"{self.language}/ql/lib/semmle/code/{self.language}/frameworks/")
6365
self.frameworkTarget = os.path.join(self.generatedFrameworks, dirname, filename)
6466
self.negativeFrameworkTarget = os.path.join(self.generatedFrameworks, dirname, "Negative" + filename)
67+
self.typeBasedFrameworkTarget = os.path.join(self.generatedFrameworks, dirname, "TypeBased" + filename)
6568

6669
self.workDir = tempfile.mkdtemp()
6770
os.makedirs(self.generatedFrameworks, exist_ok=True)
@@ -90,11 +93,15 @@ def make(language):
9093
sys.argv.remove("--with-negative-summaries")
9194
generator.generateNegativeSummaries = True
9295

96+
if "--with-typebased-summaries" in sys.argv:
97+
sys.argv.remove("--with-typebased-summaries")
98+
generator.generateTypeBasedSummaries = True
99+
93100
if "--dry-run" in sys.argv:
94101
sys.argv.remove("--dry-run")
95102
generator.dryRun = True
96103

97-
if not generator.generateSinks and not generator.generateSources and not generator.generateSummaries and not generator.generateNegativeSummaries:
104+
if not generator.generateSinks and not generator.generateSources and not generator.generateSummaries and not generator.generateNegativeSummaries and not generator.generateTypeBasedSummaries:
98105
generator.generateSinks = generator.generateSources = generator.generateSummaries = generator.generateNegativeSummaries = True
99106

100107
if len(sys.argv) < 3 or len(sys.argv) > 4:
@@ -207,7 +214,7 @@ def makeNegativeContent(self):
207214
negativeSummaryCsv = ""
208215

209216
return f"""
210-
/**
217+
/**
211218
* THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT.
212219
* Definitions of negative summaries in the {self.friendlyname} framework.
213220
*/
@@ -219,6 +226,25 @@ def makeNegativeContent(self):
219226
220227
"""
221228

229+
def makeTypeBasedContent(self):
230+
if self.generateTypeBasedSummaries:
231+
typeBasedSummaryRows = self.runQuery("type based summary models", "CaptureTypeBasedSummaryModels.ql")
232+
typeBasedSummaryCsv = self.asCsvModel("SummaryModelCsv", "TypeBasedSummary", typeBasedSummaryRows)
233+
else:
234+
typeBasedSummaryCsv = ""
235+
236+
return f"""
237+
/**
238+
* THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT.
239+
* Definitions of type based summaries in the {self.friendlyname} framework.
240+
*/
241+
242+
import {self.language}
243+
private import semmle.code.{self.language}.dataflow.ExternalFlow
244+
245+
{typeBasedSummaryCsv}
246+
247+
"""
222248

223249
def save(self, content, target):
224250
with open(target, "w") as targetQll:
@@ -237,6 +263,7 @@ def save(self, content, target):
237263
def run(self):
238264
content = self.makeContent()
239265
negativeContent = self.makeNegativeContent()
266+
typeBasedContent = self.makeTypeBasedContent()
240267

241268
if self.dryRun:
242269
print("CSV Models generated, but not written to file.")
@@ -247,3 +274,6 @@ def run(self):
247274

248275
if self.generateNegativeSummaries:
249276
self.save(negativeContent, self.negativeFrameworkTarget)
277+
278+
if self.generateTypeBasedSummaries:
279+
self.save(typeBasedContent, self.typeBasedFrameworkTarget)

0 commit comments

Comments
 (0)