@@ -5,7 +5,6 @@ import sarif_cli.traverse as S
55import sys
66import sqlite3
77import hashlib
8- import json as pyjson
98
109# --------------------------------------------------------------------
1110# Argument parsing
@@ -39,21 +38,16 @@ if not S.is_sarif_struct(sarif_struct):
3938# Compute unique id (tool version, git commit, date)
4039# --------------------------------------------------------------------
4140def compute_unique_id (sarif_struct , runi , sarif_file ):
42- try :
43- tool_version = S .get (sarif_struct , 'runs' , runi , 'tool' , 'driver' , 'version' )
44- except Exception :
45- tool_version = None
46- try :
47- revision_id = S .get (sarif_struct , 'runs' , runi , 'versionControlProvenance' , 0 , 'revisionId' )
48- except Exception :
49- revision_id = None
50- try :
51- start_time = S .get (sarif_struct , 'runs' , runi , 'invocations' , 0 , 'startTimeUtc' )
52- except Exception :
53- start_time = None
41+ def _safeget (* path ):
42+ try :
43+ return S .get (* path )
44+ except Exception :
45+ return None
46+ tool_version = _safeget (sarif_struct , 'runs' , runi , 'tool' , 'driver' , 'version' )
47+ revision_id = _safeget (sarif_struct , 'runs' , runi , 'versionControlProvenance' , 0 , 'revisionId' )
48+ start_time = _safeget (sarif_struct , 'runs' , runi , 'invocations' , 0 , 'startTimeUtc' )
5449 seed = f"{ tool_version or '' } |{ revision_id or '' } |{ start_time or '' } |{ sarif_file } "
55- h = hashlib .sha1 (seed .encode ('utf-8' )).hexdigest ()
56- return h
50+ return hashlib .sha1 (seed .encode ('utf-8' )).hexdigest ()
5751
5852# --------------------------------------------------------------------
5953# Define keep_with_context inside S
@@ -79,13 +73,15 @@ def _init_db(dbfile):
7973 line_num INTEGER,
8074 msg_type TEXT,
8175 message TEXT,
82- source_line TEXT
76+ source_line TEXT,
77+ rule_id TEXT
8378 );
8479 """ )
8580 cur .execute ("CREATE INDEX IF NOT EXISTS idx_artifact_uri ON sarif_results(artifact_uri);" )
8681 cur .execute ("CREATE INDEX IF NOT EXISTS idx_runi_resi ON sarif_results(runi, resi);" )
8782 cur .execute ("CREATE INDEX IF NOT EXISTS idx_msg_type ON sarif_results(msg_type);" )
8883 cur .execute ("CREATE INDEX IF NOT EXISTS idx_unique_id ON sarif_results(unique_id);" )
84+ cur .execute ("CREATE INDEX IF NOT EXISTS idx_rule_id ON sarif_results(rule_id);" )
8985 conn .commit ()
9086 return conn
9187
@@ -101,10 +97,10 @@ def _flush_buffer():
10197 cur .executemany ("""
10298 INSERT INTO sarif_results (
10399 sarif_file, unique_id, runi, resi, codefi, threadi, loci, related_index,
104- artifact_uri, l1, c1, l2, c2, line_num, msg_type, message, source_line
100+ artifact_uri, l1, c1, l2, c2, line_num, msg_type, message, source_line, rule_id
105101 ) VALUES (
106102 :sarif_file, :unique_id, :runi, :resi, :codefi, :threadi, :loci, :related_index,
107- :artifact_uri, :l1, :c1, :l2, :c2, :line_num, :msg_type, :message, :source_line
103+ :artifact_uri, :l1, :c1, :l2, :c2, :line_num, :msg_type, :message, :source_line, :rule_id
108104 )
109105 """ , _buffer )
110106 _conn .commit ()
@@ -131,6 +127,13 @@ for runi in S.indices(sarif_struct, 'runs'):
131127 continue
132128 for resi in S .indices (sarif_struct , 'runs' , runi , 'results' ):
133129 result = S .get (sarif_struct , 'runs' , runi , 'results' , resi )
130+ rule_id = result .get ("ruleId" )
131+ if not rule_id :
132+ try :
133+ rule_id = S .get (result , "rule" , "id" )
134+ except Exception :
135+ rule_id = None
136+
134137 # ---------------- Locations (non-path problems)
135138 if 'locations' in result :
136139 message , artifact , region = S .get_location_message_info (result )
@@ -147,7 +150,7 @@ for runi in S.indices(sarif_struct, 'runs'):
147150 "artifact_uri" : artifact .get ('uri' , '' ),
148151 "l1" : l1 , "c1" : c1 , "l2" : l2 , "c2" : c2 ,
149152 "line_num" : None , "msg_type" : "RESULT" ,
150- "message" : message , "source_line" : ""
153+ "message" : message , "source_line" : "" , "rule_id" : rule_id
151154 })
152155
153156 if region != S .WholeFile and args .list_source :
@@ -161,7 +164,7 @@ for runi in S.indices(sarif_struct, 'runs'):
161164 "artifact_uri" : artifact .get ('uri' , '' ),
162165 "l1" : l1 , "c1" : c1 , "l2" : l2 , "c2" : c2 ,
163166 "line_num" : line_num , "msg_type" : "SOURCE" ,
164- "message" : message , "source_line" : line
167+ "message" : message , "source_line" : line , "rule_id" : rule_id
165168 })
166169
167170 if args .related_locations :
@@ -178,7 +181,7 @@ for runi in S.indices(sarif_struct, 'runs'):
178181 "loci" : None , "related_index" : relo_index ,
179182 "artifact_uri" : "" , "l1" : - 1 , "c1" : - 1 , "l2" : - 1 , "c2" : - 1 ,
180183 "line_num" : None , "msg_type" : "REFERENCE" ,
181- "message" : message , "source_line" : ""
184+ "message" : message , "source_line" : "" , "rule_id" : rule_id
182185 })
183186 else :
184187 if region == S .WholeFile :
@@ -195,7 +198,7 @@ for runi in S.indices(sarif_struct, 'runs'):
195198 "artifact_uri" : artifact .get ('uri' , '' ),
196199 "l1" : l1 , "c1" : c1 , "l2" : l2 , "c2" : c2 ,
197200 "line_num" : None , "msg_type" : "REFERENCE" ,
198- "message" : message , "source_line" : ""
201+ "message" : message , "source_line" : "" , "rule_id" : rule_id
199202 })
200203 if args .list_source :
201204 lines = S .load_lines (args .list_source , artifact ['uri' ], l1 , l2 )
@@ -209,7 +212,7 @@ for runi in S.indices(sarif_struct, 'runs'):
209212 "artifact_uri" : artifact .get ('uri' , '' ),
210213 "l1" : l1 , "c1" : c1 , "l2" : l2 , "c2" : c2 ,
211214 "line_num" : line_num , "msg_type" : "SOURCE" ,
212- "message" : message , "source_line" : line
215+ "message" : message , "source_line" : line , "rule_id" : rule_id
213216 })
214217
215218 # ---------------- CodeFlows (path problems)
@@ -224,7 +227,7 @@ for runi in S.indices(sarif_struct, 'runs'):
224227 "threadi" : None , "loci" : None , "related_index" : None ,
225228 "artifact_uri" : "" , "l1" : - 1 , "c1" : - 1 , "l2" : - 1 , "c2" : - 1 ,
226229 "line_num" : None , "msg_type" : "PATH" ,
227- "message" : "" , "source_line" : ""
230+ "message" : "" , "source_line" : "" , "rule_id" : rule_id
228231 })
229232
230233 for threadi in S .indices (codeFlow , 'threadFlows' ):
@@ -253,7 +256,7 @@ for runi in S.indices(sarif_struct, 'runs'):
253256 "loci" : loci , "related_index" : None ,
254257 "artifact_uri" : "" , "l1" : - 1 , "c1" : - 1 , "l2" : - 1 , "c2" : - 1 ,
255258 "line_num" : None , "msg_type" : "FLOW_STEP" ,
256- "message" : message , "source_line" : ""
259+ "message" : message , "source_line" : "" , "rule_id" : rule_id
257260 })
258261 else :
259262 if region == S .WholeFile :
@@ -270,7 +273,7 @@ for runi in S.indices(sarif_struct, 'runs'):
270273 "artifact_uri" : artifact .get ('uri' , '' ),
271274 "l1" : l1 , "c1" : c1 , "l2" : l2 , "c2" : c2 ,
272275 "line_num" : None , "msg_type" : "FLOW_STEP" ,
273- "message" : message , "source_line" : ""
276+ "message" : message , "source_line" : "" , "rule_id" : rule_id
274277 })
275278 if args .list_source :
276279 lines = S .load_lines (args .list_source , artifact ['uri' ], l1 , l2 )
@@ -284,7 +287,7 @@ for runi in S.indices(sarif_struct, 'runs'):
284287 "artifact_uri" : artifact .get ('uri' , '' ),
285288 "l1" : l1 , "c1" : c1 , "l2" : l2 , "c2" : c2 ,
286289 "line_num" : line_num , "msg_type" : "SOURCE" ,
287- "message" : message , "source_line" : line
290+ "message" : message , "source_line" : line , "rule_id" : rule_id
288291 })
289292 last_codeFlow = codeFlow
290293 S .msg ("\n " )
@@ -294,5 +297,5 @@ for runi in S.indices(sarif_struct, 'runs'):
294297 "codefi" : None , "threadi" : None , "loci" : None , "related_index" : None ,
295298 "artifact_uri" : "" , "l1" : - 1 , "c1" : - 1 , "l2" : - 1 , "c2" : - 1 ,
296299 "line_num" : None , "msg_type" : "NEWLINE" ,
297- "message" : "" , "source_line" : ""
300+ "message" : "" , "source_line" : "" , "rule_id" : rule_id
298301 })
0 commit comments