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