노현종

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