Showing
1 changed file
with
79 additions
and
88 deletions
... | @@ -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 | } | ... | ... |
-
Please register or login to post a comment