Showing
4 changed files
with
190 additions
and
91 deletions
File mode changed
... | @@ -382,11 +382,18 @@ namespace VulnCrawler | ... | @@ -382,11 +382,18 @@ namespace VulnCrawler |
382 | { | 382 | { |
383 | return false; | 383 | return false; |
384 | } | 384 | } |
385 | + | ||
386 | + /* 대문자로 구성된 변수면 넘어감 */ | ||
387 | + if (m.Value.All(c => char.IsUpper(c) || !char.IsLetter(c))) | ||
388 | + { | ||
389 | + return false; | ||
390 | + } | ||
385 | /* 제일 앞자리가 숫자로 시작하면 넘어감 */ | 391 | /* 제일 앞자리가 숫자로 시작하면 넘어감 */ |
386 | if (Regex.IsMatch(m.Value, invalidPattern)) | 392 | if (Regex.IsMatch(m.Value, invalidPattern)) |
387 | { | 393 | { |
388 | return false; | 394 | return false; |
389 | } | 395 | } |
396 | + | ||
390 | /* 전 단계에서 구한 메서드 목록에 있으면 넘어감 */ | 397 | /* 전 단계에서 구한 메서드 목록에 있으면 넘어감 */ |
391 | if (methodSets.Contains(m.Value)) | 398 | if (methodSets.Contains(m.Value)) |
392 | { | 399 | { |
... | @@ -403,6 +410,8 @@ namespace VulnCrawler | ... | @@ -403,6 +410,8 @@ namespace VulnCrawler |
403 | { | 410 | { |
404 | return false; | 411 | return false; |
405 | } | 412 | } |
413 | + | ||
414 | + | ||
406 | return true; | 415 | return true; |
407 | }) | 416 | }) |
408 | .Distinct(new MatchComparer()); | 417 | .Distinct(new MatchComparer()); | ... | ... |
... | @@ -232,7 +232,6 @@ namespace VulnCrawler | ... | @@ -232,7 +232,6 @@ namespace VulnCrawler |
232 | // srcCode = Regex.Replace(srcCode, @"if.+\n\{", @"if.+\{", RegexOptions.Multiline); | 232 | // srcCode = Regex.Replace(srcCode, @"if.+\n\{", @"if.+\{", RegexOptions.Multiline); |
233 | 233 | ||
234 | var split = srcCode.Split('\n'); | 234 | var split = srcCode.Split('\n'); |
235 | - int bracketCount = 0; | ||
236 | var blockList = new List<Block>(); | 235 | var blockList = new List<Block>(); |
237 | StringBuilder builder = new StringBuilder(); | 236 | StringBuilder builder = new StringBuilder(); |
238 | var crList = criticalList as HashSet<string>; | 237 | var crList = criticalList as HashSet<string>; |
... | @@ -240,121 +239,211 @@ namespace VulnCrawler | ... | @@ -240,121 +239,211 @@ namespace VulnCrawler |
240 | { | 239 | { |
241 | return null; | 240 | return null; |
242 | } | 241 | } |
243 | - bool hasIf = false; | 242 | + |
244 | - bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */ | 243 | + var mainQ = new Queue<string>(); |
245 | - bool criticalBlock = false; /* 현재 라인이 크리티컬 블록 라인인지 */ | 244 | + var groupQ = new Queue<string>(); |
246 | - int blockNum = 1; /* 블록 번호 */ | 245 | + bool mainLine = true; |
246 | + int crNum = 1; | ||
247 | + int bracketCount = 1; | ||
248 | + bool prevStartBlock = false; | ||
247 | foreach (var line in split) | 249 | foreach (var line in split) |
248 | { | 250 | { |
249 | - bool hasRight = false; | 251 | + bool criticalBlock = false; |
250 | - | 252 | + string trimLine = line.Trim(); |
251 | - string trim = line.Trim(); | 253 | + if (mainLine) |
252 | - | ||
253 | - /* 중괄호 수 세기 */ | ||
254 | - int openBracketCount = trim.Count(c => c == '{'); | ||
255 | - int closeBracketCount = trim.Count(c => c == '}'); | ||
256 | - //if (!hasIf) | ||
257 | - //{ | ||
258 | - // if (Regex.IsMatch(trim, @"^if.+\)$")) | ||
259 | - // { | ||
260 | - // // Console.WriteLine("if 들어감"); | ||
261 | - // hasIf = true; | ||
262 | - // } | ||
263 | - //} | ||
264 | - //else | ||
265 | - //{ | ||
266 | - // if (!Regex.IsMatch(trim, @"^\{")) | ||
267 | - // { | ||
268 | - // openBracketCount++; | ||
269 | - // } | ||
270 | - // hasIf = false; | ||
271 | - //} | ||
272 | - | ||
273 | - | ||
274 | - | ||
275 | - int subtract = openBracketCount - closeBracketCount; | ||
276 | - bracketCount += subtract; | ||
277 | - | ||
278 | - | ||
279 | - if (trim.Equals("}")) | ||
280 | { | 254 | { |
281 | - builder.AppendLine(line); | 255 | + if (trimLine.EndsWith("&&") || trimLine.EndsWith("||")) |
282 | - hasRight = true; | 256 | + { |
257 | + mainQ.Enqueue(line); | ||
258 | + continue; | ||
259 | + } | ||
260 | + | ||
261 | + if (trimLine.StartsWith("&&") || trimLine.StartsWith("||")) | ||
262 | + { | ||
263 | + groupQ.Enqueue(line); | ||
264 | + continue; | ||
265 | + } | ||
266 | + | ||
267 | + | ||
268 | + | ||
269 | + bracketCount = 1; | ||
270 | + StringBuilder groupBuilder = new StringBuilder(); | ||
271 | + while(groupQ.Count > 0) | ||
272 | + { | ||
273 | + string s = groupQ.Dequeue(); | ||
274 | + if (!criticalBlock) | ||
275 | + { | ||
276 | + foreach (var item in ExtractCriticalVariant(s)) | ||
277 | + { | ||
278 | + if (crList.Contains(item)) | ||
279 | + { | ||
280 | + criticalBlock = true; | ||
281 | + break; | ||
282 | + } | ||
283 | + } | ||
284 | + } | ||
285 | + groupBuilder.AppendLine(s); | ||
286 | + } | ||
287 | + | ||
288 | + if (groupBuilder.Length > 0) | ||
289 | + { | ||
290 | + blockList.Add(new Block { Code = groupBuilder.ToString(), HasCritical = criticalBlock, Num = crNum++}); | ||
291 | + } | ||
292 | + if (Regex.IsMatch(trimLine, @"(if|for|while|switch|do)\s*")) | ||
293 | + { | ||
294 | + if (!trimLine.EndsWith("{")) | ||
295 | + { | ||
296 | + mainLine = false; | ||
297 | + prevStartBlock = true; | ||
298 | + | ||
299 | + } | ||
300 | + else if (trimLine.EndsWith(";")) | ||
301 | + { | ||
302 | + mainLine = true; | ||
303 | + } | ||
304 | + else | ||
305 | + { | ||
306 | + mainLine = false; | ||
307 | + bracketCount++; | ||
308 | + } | ||
309 | + | ||
310 | + groupQ.Enqueue(line); | ||
311 | + | ||
312 | + | ||
313 | + continue; | ||
314 | + } | ||
315 | + mainQ.Enqueue(line); | ||
283 | } | 316 | } |
284 | - /* 중괄호 연산 결과 1이라는 것은 메인 라인 */ | 317 | + else |
285 | - if (bracketCount == 1) | ||
286 | { | 318 | { |
287 | - /* | 319 | + |
288 | - * 깊이가 1인데 mainLine이 | 320 | + |
289 | - * false 이면 넘어왔다는 것이니 현재까지 코드 | 321 | + /* 중괄호 수 세기 */ |
290 | - * blockList에 추가 | 322 | + int openBracketCount = trimLine.Count(c => c == '{'); |
291 | - */ | 323 | + int closeBracketCount = trimLine.Count(c => c == '}'); |
292 | - if (!mainLine) | 324 | + int subtract = openBracketCount - closeBracketCount; |
325 | + bracketCount += subtract; | ||
326 | + | ||
327 | + | ||
328 | + if (trimLine.EndsWith("&&") || trimLine.EndsWith("||")) | ||
329 | + { | ||
330 | + groupQ.Enqueue(line); | ||
331 | + continue; | ||
332 | + } | ||
333 | + | ||
334 | + //if (trimLine.StartsWith("&&") || trimLine.StartsWith("||")) | ||
335 | + //{ | ||
336 | + // mainQ.Enqueue(line); | ||
337 | + // continue; | ||
338 | + | ||
339 | + //} | ||
340 | + groupQ.Enqueue(line); | ||
341 | + if (prevStartBlock) | ||
342 | + { | ||
343 | + prevStartBlock = false; | ||
344 | + if (Regex.IsMatch(trimLine, @"(if|for|while|switch|do)\s*\(")) | ||
345 | + { | ||
346 | + prevStartBlock = true; | ||
347 | + continue; | ||
348 | + | ||
349 | + } | ||
350 | + else if(trimLine.EndsWith(";")) | ||
351 | + { | ||
352 | + bracketCount--; | ||
353 | + } | ||
354 | + } | ||
355 | + | ||
356 | + if (bracketCount <= 1) | ||
357 | + { | ||
358 | + if (trimLine.Contains("else")) | ||
359 | + { | ||
360 | + bracketCount++; | ||
361 | + prevStartBlock = true; | ||
362 | + continue; | ||
363 | + } | ||
364 | + | ||
365 | + mainLine = true; | ||
366 | + } | ||
367 | + | ||
368 | + StringBuilder mainBuilder = new StringBuilder(); | ||
369 | + while (mainQ.Count > 0) | ||
293 | { | 370 | { |
294 | - string s = builder.ToString(); | 371 | + string s = mainQ.Dequeue(); |
295 | - if (!string.IsNullOrWhiteSpace(s)) | 372 | + if (!criticalBlock) |
296 | { | 373 | { |
297 | - blockList.Add(new Block() { HasCritical = criticalBlock, Code = s, Num = blockNum }); | 374 | + foreach (var item in ExtractCriticalVariant(s)) |
298 | - blockNum++; | 375 | + { |
299 | - criticalBlock = false; | 376 | + if (crList.Contains(item)) |
300 | - builder.Clear(); | 377 | + { |
378 | + criticalBlock = true; | ||
379 | + break; | ||
380 | + } | ||
381 | + } | ||
301 | } | 382 | } |
383 | + mainBuilder.AppendLine(s); | ||
384 | + } | ||
385 | + | ||
386 | + if (mainBuilder.Length > 0) | ||
387 | + { | ||
388 | + blockList.Add(new Block { Code = mainBuilder.ToString(), HasCritical = criticalBlock, Num = crNum++ }); | ||
302 | } | 389 | } |
303 | - mainLine = true; | 390 | + |
391 | + | ||
304 | } | 392 | } |
305 | - /* 2 이상이라는 건 메인 라인 X */ | 393 | + |
306 | - else if(bracketCount >= 2) | 394 | + |
395 | + } | ||
396 | + | ||
397 | + bool cb = false; | ||
398 | + if (mainQ.Count > 0) | ||
399 | + { | ||
400 | + StringBuilder mainBuilder = new StringBuilder(); | ||
401 | + while (mainQ.Count > 0) | ||
307 | { | 402 | { |
308 | - /* | 403 | + string s = mainQ.Dequeue(); |
309 | - * 깊이가 2 이상인데 mainLine이 | 404 | + if (!cb) |
310 | - * true면 넘어왔다는 것이니 현재까지 코드 | ||
311 | - * blockList에 추가 | ||
312 | - */ | ||
313 | - if (mainLine) | ||
314 | { | 405 | { |
315 | - string s = builder.ToString(); | 406 | + foreach (var item in ExtractCriticalVariant(s)) |
316 | - if (!string.IsNullOrWhiteSpace(s)) | ||
317 | { | 407 | { |
318 | - blockList.Add(new Block() { HasCritical = criticalBlock, Code = s, Num = blockNum }); | 408 | + if (crList.Contains(item)) |
319 | - blockNum++; | 409 | + { |
320 | - criticalBlock = false; | 410 | + cb = true; |
321 | - builder.Clear(); | 411 | + break; |
412 | + } | ||
322 | } | 413 | } |
323 | } | 414 | } |
324 | - mainLine = false; | 415 | + mainBuilder.AppendLine(s); |
325 | } | 416 | } |
326 | - /* 이도 저도 아니면 그냥 넘어감 */ | 417 | + |
327 | - else | 418 | + if (mainBuilder.Length > 0) |
328 | { | 419 | { |
329 | - continue; | 420 | + blockList.Add(new Block { Code = mainBuilder.ToString(), HasCritical = cb, Num = crNum++ }); |
330 | } | 421 | } |
331 | - /* 현재 코드 라인에서 변수 추출시켜서 크리티컬 리스트와 대조 */ | 422 | + } |
332 | - foreach (var var in ExtractCriticalVariant(line)) | 423 | + else |
424 | + { | ||
425 | + StringBuilder groupBuilder = new StringBuilder(); | ||
426 | + while (groupQ.Count > 0) | ||
333 | { | 427 | { |
334 | - /* 크리티컬 리스트에 추출한 변수가 들어있다면 추가 */ | 428 | + string s = groupQ.Dequeue(); |
335 | - if (criticalList.Contains(var)) | 429 | + if (!cb) |
336 | { | 430 | { |
337 | - criticalBlock = true; | 431 | + foreach (var item in ExtractCriticalVariant(s)) |
338 | - break; | 432 | + { |
433 | + if (crList.Contains(item)) | ||
434 | + { | ||
435 | + cb = true; | ||
436 | + break; | ||
437 | + } | ||
438 | + } | ||
339 | } | 439 | } |
440 | + groupBuilder.AppendLine(s); | ||
340 | } | 441 | } |
341 | 442 | ||
342 | - if (!hasRight) | 443 | + if (groupBuilder.Length > 0) |
343 | { | 444 | { |
344 | - builder.AppendLine(line); | 445 | + blockList.Add(new Block { Code = groupBuilder.ToString(), HasCritical = cb, Num = crNum++ }); |
345 | - | ||
346 | } | 446 | } |
347 | - | ||
348 | - } | ||
349 | - | ||
350 | - /* 마지막 남은게 있을 수 있으니 추가 */ | ||
351 | - string fs = builder.ToString(); | ||
352 | - if (!string.IsNullOrWhiteSpace(fs)) | ||
353 | - { | ||
354 | - blockList.Add(new Block() { HasCritical = criticalBlock, Code = fs, Num = blockNum }); | ||
355 | - blockNum++; | ||
356 | - criticalBlock = false; | ||
357 | - builder.Clear(); | ||
358 | } | 447 | } |
359 | 448 | ||
360 | return blockList; | 449 | return blockList; | ... | ... |
_config.yml
0 → 100644
1 | +theme: jekyll-theme-midnight | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment