노현종

중괄호 없는 if문 구분 못하는 문제 해결

...@@ -241,36 +241,21 @@ namespace VulnCrawler ...@@ -241,36 +241,21 @@ namespace VulnCrawler
241 return null; 241 return null;
242 } 242 }
243 bool hasIf = false; 243 bool hasIf = false;
244 + string prevLine = string.Empty;
244 bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */ 245 bool mainLine = true; /* 현재 라인이 메인 코드 라인인지 */
245 bool criticalBlock = false; /* 현재 라인이 크리티컬 블록 라인인지 */ 246 bool criticalBlock = false; /* 현재 라인이 크리티컬 블록 라인인지 */
246 int blockNum = 1; /* 블록 번호 */ 247 int blockNum = 1; /* 블록 번호 */
248 +
247 foreach (var line in split) 249 foreach (var line in split)
248 { 250 {
249 bool hasRight = false; 251 bool hasRight = false;
250 - 252 + bool hasIf2 = false;
253 +
251 string trim = line.Trim(); 254 string trim = line.Trim();
252 255
253 /* 중괄호 수 세기 */ 256 /* 중괄호 수 세기 */
254 int openBracketCount = trim.Count(c => c == '{'); 257 int openBracketCount = trim.Count(c => c == '{');
255 int closeBracketCount = trim.Count(c => c == '}'); 258 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 259
275 int subtract = openBracketCount - closeBracketCount; 260 int subtract = openBracketCount - closeBracketCount;
276 bracketCount += subtract; 261 bracketCount += subtract;
...@@ -284,12 +269,29 @@ namespace VulnCrawler ...@@ -284,12 +269,29 @@ namespace VulnCrawler
284 /* 중괄호 연산 결과 1이라는 것은 메인 라인 */ 269 /* 중괄호 연산 결과 1이라는 것은 메인 라인 */
285 if (bracketCount == 1) 270 if (bracketCount == 1)
286 { 271 {
272 + if (!hasIf)
273 + {
274 + if (Regex.IsMatch(trim, @"^(if|for|while).+\)$"))
275 + {
276 + prevLine = line;
277 + hasIf = true;
278 + }
279 + }
280 + else
281 + {
282 + if (!trim.StartsWith("{"))
283 + {
284 + hasIf2 = true;
285 + builder.AppendLine(line);
286 + }
287 + hasIf = false;
288 + }
287 /* 289 /*
288 * 깊이가 1인데 mainLine이 290 * 깊이가 1인데 mainLine이
289 * false 이면 넘어왔다는 것이니 현재까지 코드 291 * false 이면 넘어왔다는 것이니 현재까지 코드
290 * blockList에 추가 292 * blockList에 추가
291 */ 293 */
292 - if (!mainLine) 294 + if (!mainLine || hasIf2)
293 { 295 {
294 string s = builder.ToString(); 296 string s = builder.ToString();
295 if (!string.IsNullOrWhiteSpace(s)) 297 if (!string.IsNullOrWhiteSpace(s))
...@@ -299,6 +301,7 @@ namespace VulnCrawler ...@@ -299,6 +301,7 @@ namespace VulnCrawler
299 criticalBlock = false; 301 criticalBlock = false;
300 builder.Clear(); 302 builder.Clear();
301 } 303 }
304 +
302 } 305 }
303 mainLine = true; 306 mainLine = true;
304 } 307 }
...@@ -339,7 +342,7 @@ namespace VulnCrawler ...@@ -339,7 +342,7 @@ namespace VulnCrawler
339 } 342 }
340 } 343 }
341 344
342 - if (!hasRight) 345 + if (!hasRight && !hasIf2)
343 { 346 {
344 builder.AppendLine(line); 347 builder.AppendLine(line);
345 348
......