@@ -15,12 +15,13 @@ def __init__ (self, language):
15
15
self .generateSources = False
16
16
self .generateSummaries = False
17
17
self .generateNegativeSummaries = False
18
+ self .generateTypeBasedSummaries = False
18
19
self .dryRun = False
19
20
20
21
21
22
def printHelp (self ):
22
23
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]
24
25
25
26
This generates summary, source and sink models for the code in the database.
26
27
The files will be placed in `{ self .language } /ql/lib/semmle/code/{ self .language } /frameworks/<outputQll>` where
@@ -33,6 +34,7 @@ def printHelp(self):
33
34
--with-sources
34
35
--with-summaries
35
36
--with-negative-summaries
37
+ --with-typebased-summaries (Experimental - only for C#)
36
38
If none of these flags are specified, all models are generated.
37
39
38
40
--dry-run: Only run the queries, but don't write to file.
@@ -62,6 +64,7 @@ def setenvironment(self, target, database, friendlyName):
62
64
self .codeQlRoot , f"{ self .language } /ql/lib/semmle/code/{ self .language } /frameworks/" )
63
65
self .frameworkTarget = os .path .join (self .generatedFrameworks , dirname , filename )
64
66
self .negativeFrameworkTarget = os .path .join (self .generatedFrameworks , dirname , "Negative" + filename )
67
+ self .typeBasedFrameworkTarget = os .path .join (self .generatedFrameworks , dirname , "TypeBased" + filename )
65
68
66
69
self .workDir = tempfile .mkdtemp ()
67
70
os .makedirs (self .generatedFrameworks , exist_ok = True )
@@ -90,11 +93,15 @@ def make(language):
90
93
sys .argv .remove ("--with-negative-summaries" )
91
94
generator .generateNegativeSummaries = True
92
95
96
+ if "--with-typebased-summaries" in sys .argv :
97
+ sys .argv .remove ("--with-typebased-summaries" )
98
+ generator .generateTypeBasedSummaries = True
99
+
93
100
if "--dry-run" in sys .argv :
94
101
sys .argv .remove ("--dry-run" )
95
102
generator .dryRun = True
96
103
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 :
98
105
generator .generateSinks = generator .generateSources = generator .generateSummaries = generator .generateNegativeSummaries = True
99
106
100
107
if len (sys .argv ) < 3 or len (sys .argv ) > 4 :
@@ -207,7 +214,7 @@ def makeNegativeContent(self):
207
214
negativeSummaryCsv = ""
208
215
209
216
return f"""
210
- /**
217
+ /**
211
218
* THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT.
212
219
* Definitions of negative summaries in the { self .friendlyname } framework.
213
220
*/
@@ -219,6 +226,25 @@ def makeNegativeContent(self):
219
226
220
227
"""
221
228
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
+ """
222
248
223
249
def save (self , content , target ):
224
250
with open (target , "w" ) as targetQll :
@@ -237,6 +263,7 @@ def save(self, content, target):
237
263
def run (self ):
238
264
content = self .makeContent ()
239
265
negativeContent = self .makeNegativeContent ()
266
+ typeBasedContent = self .makeTypeBasedContent ()
240
267
241
268
if self .dryRun :
242
269
print ("CSV Models generated, but not written to file." )
@@ -247,3 +274,6 @@ def run(self):
247
274
248
275
if self .generateNegativeSummaries :
249
276
self .save (negativeContent , self .negativeFrameworkTarget )
277
+
278
+ if self .generateTypeBasedSummaries :
279
+ self .save (typeBasedContent , self .typeBasedFrameworkTarget )
0 commit comments