노현종

크리티컬 블록 선정 수정중... 중괄호 기반이 아닌 syntax 기반

...@@ -240,126 +240,117 @@ namespace VulnCrawler ...@@ -240,126 +240,117 @@ namespace VulnCrawler
240 { 240 {
241 return null; 241 return null;
242 } 242 }
243 - bool hasIf = false;
244 - string prevLine = string.Empty;
245 bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */ 243 bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */
246 - bool criticalBlock = false; /* 현재 라인이 크리티컬 블록 라인인지 */ 244 +
247 int blockNum = 1; /* 블록 번호 */ 245 int blockNum = 1; /* 블록 번호 */
248 246
247 +
248 + bool group = false;
249 + Queue<string> groupQ = new Queue<string>();
250 + var mainQ = new Queue<string>();
251 +
249 foreach (var line in split) 252 foreach (var line in split)
250 { 253 {
251 - bool hasRight = false; 254 + bool criticalBlock = false; /* 현재 라인이 크리티컬 블록 라인인지 */
252 - bool hasIf2 = false;
253 255
254 string trim = line.Trim(); 256 string trim = line.Trim();
255 257
256 - /* 중괄호 수 세기 */ 258 + if (Regex.IsMatch(trim, @"^(if|for|while)"))
257 - int openBracketCount = trim.Count(c => c == '{');
258 - int closeBracketCount = trim.Count(c => c == '}');
259 -
260 - int subtract = openBracketCount - closeBracketCount;
261 - bracketCount += subtract;
262 -
263 -
264 - if (trim.Equals("}"))
265 { 259 {
266 - builder.AppendLine(line); 260 + group = true;
267 - hasRight = true; 261 + mainLine = false;
268 - } 262 + groupQ.Enqueue(line);
269 - /* 중괄호 연산 결과 1이라는 것은 메인 라인 */ 263 + if (trim.EndsWith("{"))
270 - if (bracketCount == 1)
271 - {
272 - if (!hasIf)
273 - {
274 - if (Regex.IsMatch(trim, @"^(if|for|while).+\)$"))
275 { 264 {
276 - prevLine = line; 265 + group = true;
277 - hasIf = true;
278 } 266 }
279 - } 267 + else if (trim.EndsWith("}"))
280 - else
281 { 268 {
282 - if (!trim.StartsWith("{")) 269 + group = false;
270 + }
271 + else if(trim.EndsWith(";"))
283 { 272 {
284 - hasIf2 = true; 273 + group = false;
285 - builder.AppendLine(line);
286 } 274 }
287 - hasIf = false; 275 + continue;
288 } 276 }
289 - /* 277 +
290 - * 깊이가 1인데 mainLine이 278 + if (group)
291 - * false 이면 넘어왔다는 것이니 현재까지 코드
292 - * blockList에 추가
293 - */
294 - if (!mainLine || hasIf2)
295 { 279 {
296 - string s = builder.ToString(); 280 + groupQ.Enqueue(line);
297 - if (!string.IsNullOrWhiteSpace(s)) 281 + if (trim.EndsWith("}"))
298 { 282 {
299 - blockList.Add(new Block() { HasCritical = criticalBlock, Code = s, Num = blockNum }); 283 + group = false;
300 - blockNum++;
301 - criticalBlock = false;
302 - builder.Clear();
303 } 284 }
304 - 285 + else if (trim.EndsWith(";"))
286 + {
287 + group = false;
305 } 288 }
306 - mainLine = true; 289 + continue;
307 } 290 }
308 - /* 2 이상이라는 건 메인 라인 X */ 291 +
309 - else if(bracketCount >= 2) 292 + mainQ.Enqueue(line);
293 +
294 + StringBuilder mainBuilder = new StringBuilder();
295 + if (!mainLine)
310 { 296 {
311 - /* 297 + while(mainQ.Count > 0)
312 - * 깊이가 2 이상인데 mainLine이
313 - * true면 넘어왔다는 것이니 현재까지 코드
314 - * blockList에 추가
315 - */
316 - if (mainLine)
317 { 298 {
318 - string s = builder.ToString(); 299 + string s = mainQ.Dequeue();
319 - if (!string.IsNullOrWhiteSpace(s)) 300 + if (!criticalBlock)
320 { 301 {
321 - blockList.Add(new Block() { HasCritical = criticalBlock, Code = s, Num = blockNum }); 302 + foreach (var var in ExtractCriticalVariant(s))
322 - blockNum++; 303 + {
323 - criticalBlock = false; 304 + if (crList.Contains(var))
324 - builder.Clear(); 305 + {
306 + criticalBlock = true;
307 + break;
325 } 308 }
326 } 309 }
327 - mainLine = false;
328 } 310 }
329 - /* 이도 저도 아니면 그냥 넘어감 */ 311 + mainBuilder.AppendLine(s);
330 - else 312 + }
313 + if (mainBuilder.Length > 0)
331 { 314 {
332 - continue; 315 + blockList.Add(new Block { Code = mainBuilder.ToString(), HasCritical = criticalBlock, Num = blockNum++ });
316 + //continue;
317 + }
333 } 318 }
334 - /* 현재 코드 라인에서 변수 추출시켜서 크리티컬 리스트와 대조 */ 319 +
335 - foreach (var var in ExtractCriticalVariant(line)) 320 + StringBuilder groupBuilder = new StringBuilder();
321 + while (groupQ.Count > 0)
322 + {
323 + var s = groupQ.Dequeue();
324 + if (!criticalBlock)
336 { 325 {
337 - /* 크리티컬 리스트에 추출한 변수가 들어있다면 추가 */ 326 + foreach (var var in ExtractCriticalVariant(s))
338 - if (criticalList.Contains(var)) 327 + {
328 + if (crList.Contains(var))
339 { 329 {
340 criticalBlock = true; 330 criticalBlock = true;
341 break; 331 break;
342 } 332 }
343 } 333 }
344 - 334 + }
345 - if (!hasRight && !hasIf2) 335 + groupBuilder.AppendLine(s);
336 + }
337 + if (groupBuilder.Length > 0)
346 { 338 {
347 - builder.AppendLine(line); 339 + blockList.Add(new Block { Code = groupBuilder.ToString(), HasCritical = criticalBlock, Num = blockNum++ });
348 - 340 + continue;
349 } 341 }
350 342
351 - }
352 343
353 - /* 마지막 남은게 있을 수 있으니 추가 */ 344 +
354 - string fs = builder.ToString(); 345 +
355 - if (!string.IsNullOrWhiteSpace(fs)) 346 + mainLine = true;
356 - { 347 +
357 - blockList.Add(new Block() { HasCritical = criticalBlock, Code = fs, Num = blockNum }); 348 +
358 - blockNum++; 349 +
359 - criticalBlock = false; 350 +
360 - builder.Clear();
361 } 351 }
362 352
353 + Console.WriteLine("끝");
363 return blockList; 354 return blockList;
364 } 355 }
365 } 356 }
......