Showing
2 changed files
with
161 additions
and
57 deletions
| ... | @@ -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,68 +239,141 @@ namespace VulnCrawler | ... | @@ -240,68 +239,141 @@ namespace VulnCrawler |
| 240 | { | 239 | { |
| 241 | return null; | 240 | return null; |
| 242 | } | 241 | } |
| 243 | - bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */ | ||
| 244 | - | ||
| 245 | - int blockNum = 1; /* 블록 번호 */ | ||
| 246 | - | ||
| 247 | 242 | ||
| 248 | - bool group = false; | ||
| 249 | - Queue<string> groupQ = new Queue<string>(); | ||
| 250 | var mainQ = new Queue<string>(); | 243 | var mainQ = new Queue<string>(); |
| 251 | - | 244 | + var groupQ = new Queue<string>(); |
| 245 | + bool mainLine = true; | ||
| 246 | + int crNum = 1; | ||
| 247 | + int bracketCount = 1; | ||
| 248 | + bool prevStartBlock = false; | ||
| 252 | foreach (var line in split) | 249 | foreach (var line in split) |
| 253 | { | 250 | { |
| 254 | - bool criticalBlock = false; /* 현재 라인이 크리티컬 블록 라인인지 */ | 251 | + bool criticalBlock = false; |
| 252 | + string trimLine = line.Trim(); | ||
| 253 | + if (mainLine) | ||
| 254 | + { | ||
| 255 | + if (trimLine.EndsWith("&&") || trimLine.EndsWith("||")) | ||
| 256 | + { | ||
| 257 | + mainQ.Enqueue(line); | ||
| 258 | + continue; | ||
| 259 | + } | ||
| 255 | 260 | ||
| 256 | - string trim = line.Trim(); | 261 | + if (trimLine.StartsWith("&&") || trimLine.StartsWith("||")) |
| 262 | + { | ||
| 263 | + groupQ.Enqueue(line); | ||
| 264 | + continue; | ||
| 265 | + } | ||
| 257 | 266 | ||
| 258 | - if (Regex.IsMatch(trim, @"^(if|for|while)")) | 267 | + |
| 259 | - { | 268 | + |
| 260 | - group = true; | 269 | + bracketCount = 1; |
| 261 | - mainLine = false; | 270 | + StringBuilder groupBuilder = new StringBuilder(); |
| 262 | - groupQ.Enqueue(line); | 271 | + while(groupQ.Count > 0) |
| 263 | - if (trim.EndsWith("{")) | ||
| 264 | { | 272 | { |
| 265 | - group = true; | 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); | ||
| 266 | } | 286 | } |
| 267 | - else if (trim.EndsWith("}")) | 287 | + |
| 288 | + if (groupBuilder.Length > 0) | ||
| 268 | { | 289 | { |
| 269 | - group = false; | 290 | + blockList.Add(new Block { Code = groupBuilder.ToString(), HasCritical = criticalBlock, Num = crNum++}); |
| 270 | } | 291 | } |
| 271 | - else if(trim.EndsWith(";")) | 292 | + if (Regex.IsMatch(trimLine, @"(if|for|while|switch|do)\s*")) |
| 272 | { | 293 | { |
| 273 | - group = false; | 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; | ||
| 274 | } | 314 | } |
| 275 | - continue; | 315 | + mainQ.Enqueue(line); |
| 276 | } | 316 | } |
| 277 | - | 317 | + else |
| 278 | - if (group) | ||
| 279 | { | 318 | { |
| 280 | - groupQ.Enqueue(line); | 319 | + |
| 281 | - if (trim.EndsWith("}")) | 320 | + |
| 321 | + /* 중괄호 수 세기 */ | ||
| 322 | + int openBracketCount = trimLine.Count(c => c == '{'); | ||
| 323 | + int closeBracketCount = trimLine.Count(c => c == '}'); | ||
| 324 | + int subtract = openBracketCount - closeBracketCount; | ||
| 325 | + bracketCount += subtract; | ||
| 326 | + | ||
| 327 | + | ||
| 328 | + if (trimLine.EndsWith("&&") || trimLine.EndsWith("||")) | ||
| 282 | { | 329 | { |
| 283 | - group = false; | 330 | + groupQ.Enqueue(line); |
| 331 | + continue; | ||
| 284 | } | 332 | } |
| 285 | - else if (trim.EndsWith(";")) | 333 | + |
| 334 | + //if (trimLine.StartsWith("&&") || trimLine.StartsWith("||")) | ||
| 335 | + //{ | ||
| 336 | + // mainQ.Enqueue(line); | ||
| 337 | + // continue; | ||
| 338 | + | ||
| 339 | + //} | ||
| 340 | + groupQ.Enqueue(line); | ||
| 341 | + if (prevStartBlock) | ||
| 286 | { | 342 | { |
| 287 | - group = false; | 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 | + } | ||
| 288 | } | 354 | } |
| 289 | - continue; | ||
| 290 | - } | ||
| 291 | 355 | ||
| 292 | - mainQ.Enqueue(line); | 356 | + if (bracketCount <= 1) |
| 357 | + { | ||
| 358 | + if (trimLine.Contains("else")) | ||
| 359 | + { | ||
| 360 | + bracketCount++; | ||
| 361 | + prevStartBlock = true; | ||
| 362 | + continue; | ||
| 363 | + } | ||
| 293 | 364 | ||
| 294 | - StringBuilder mainBuilder = new StringBuilder(); | 365 | + mainLine = true; |
| 295 | - if (!mainLine) | 366 | + } |
| 296 | - { | 367 | + |
| 297 | - while(mainQ.Count > 0) | 368 | + StringBuilder mainBuilder = new StringBuilder(); |
| 369 | + while (mainQ.Count > 0) | ||
| 298 | { | 370 | { |
| 299 | string s = mainQ.Dequeue(); | 371 | string s = mainQ.Dequeue(); |
| 300 | if (!criticalBlock) | 372 | if (!criticalBlock) |
| 301 | { | 373 | { |
| 302 | - foreach (var var in ExtractCriticalVariant(s)) | 374 | + foreach (var item in ExtractCriticalVariant(s)) |
| 303 | { | 375 | { |
| 304 | - if (crList.Contains(var)) | 376 | + if (crList.Contains(item)) |
| 305 | { | 377 | { |
| 306 | criticalBlock = true; | 378 | criticalBlock = true; |
| 307 | break; | 379 | break; |
| ... | @@ -310,47 +382,70 @@ namespace VulnCrawler | ... | @@ -310,47 +382,70 @@ namespace VulnCrawler |
| 310 | } | 382 | } |
| 311 | mainBuilder.AppendLine(s); | 383 | mainBuilder.AppendLine(s); |
| 312 | } | 384 | } |
| 385 | + | ||
| 313 | if (mainBuilder.Length > 0) | 386 | if (mainBuilder.Length > 0) |
| 314 | { | 387 | { |
| 315 | - blockList.Add(new Block { Code = mainBuilder.ToString(), HasCritical = criticalBlock, Num = blockNum++ }); | 388 | + blockList.Add(new Block { Code = mainBuilder.ToString(), HasCritical = criticalBlock, Num = crNum++ }); |
| 316 | - //continue; | 389 | + } |
| 390 | + | ||
| 391 | + | ||
| 392 | + } | ||
| 393 | + | ||
| 394 | + | ||
| 395 | + } | ||
| 396 | + | ||
| 397 | + bool cb = false; | ||
| 398 | + if (mainQ.Count > 0) | ||
| 399 | + { | ||
| 400 | + StringBuilder mainBuilder = new StringBuilder(); | ||
| 401 | + while (mainQ.Count > 0) | ||
| 402 | + { | ||
| 403 | + string s = mainQ.Dequeue(); | ||
| 404 | + if (!cb) | ||
| 405 | + { | ||
| 406 | + foreach (var item in ExtractCriticalVariant(s)) | ||
| 407 | + { | ||
| 408 | + if (crList.Contains(item)) | ||
| 409 | + { | ||
| 410 | + cb = true; | ||
| 411 | + break; | ||
| 412 | + } | ||
| 413 | + } | ||
| 317 | } | 414 | } |
| 415 | + mainBuilder.AppendLine(s); | ||
| 318 | } | 416 | } |
| 319 | 417 | ||
| 418 | + if (mainBuilder.Length > 0) | ||
| 419 | + { | ||
| 420 | + blockList.Add(new Block { Code = mainBuilder.ToString(), HasCritical = cb, Num = crNum++ }); | ||
| 421 | + } | ||
| 422 | + } | ||
| 423 | + else | ||
| 424 | + { | ||
| 320 | StringBuilder groupBuilder = new StringBuilder(); | 425 | StringBuilder groupBuilder = new StringBuilder(); |
| 321 | while (groupQ.Count > 0) | 426 | while (groupQ.Count > 0) |
| 322 | { | 427 | { |
| 323 | - var s = groupQ.Dequeue(); | 428 | + string s = groupQ.Dequeue(); |
| 324 | - if (!criticalBlock) | 429 | + if (!cb) |
| 325 | { | 430 | { |
| 326 | - foreach (var var in ExtractCriticalVariant(s)) | 431 | + foreach (var item in ExtractCriticalVariant(s)) |
| 327 | { | 432 | { |
| 328 | - if (crList.Contains(var)) | 433 | + if (crList.Contains(item)) |
| 329 | { | 434 | { |
| 330 | - criticalBlock = true; | 435 | + cb = true; |
| 331 | break; | 436 | break; |
| 332 | } | 437 | } |
| 333 | } | 438 | } |
| 334 | } | 439 | } |
| 335 | groupBuilder.AppendLine(s); | 440 | groupBuilder.AppendLine(s); |
| 336 | } | 441 | } |
| 442 | + | ||
| 337 | if (groupBuilder.Length > 0) | 443 | if (groupBuilder.Length > 0) |
| 338 | { | 444 | { |
| 339 | - blockList.Add(new Block { Code = groupBuilder.ToString(), HasCritical = criticalBlock, Num = blockNum++ }); | 445 | + blockList.Add(new Block { Code = groupBuilder.ToString(), HasCritical = cb, Num = crNum++ }); |
| 340 | - continue; | ||
| 341 | } | 446 | } |
| 342 | - | ||
| 343 | - | ||
| 344 | - | ||
| 345 | - | ||
| 346 | - mainLine = true; | ||
| 347 | - | ||
| 348 | - | ||
| 349 | - | ||
| 350 | - | ||
| 351 | } | 447 | } |
| 352 | 448 | ||
| 353 | - Console.WriteLine("끝"); | ||
| 354 | return blockList; | 449 | return blockList; |
| 355 | } | 450 | } |
| 356 | } | 451 | } | ... | ... |
-
Please register or login to post a comment