2013-10-23 2 views
1

찾을 매직 넘버마다 msg를 "매직 넘버 발견"msg와 함께 출력해야합니다.매직 넘버 확인

.C 파일을 파싱 중입니다.

매직 넘버는 기본적으로

if(list == 5)   // here 5 is magic number 

for(int i = 0; i<6; i++)  //here 6 is magic number 

MY 코드

use strict; 
use warnings; 
my $input = $ARGV[0]; 
open(FILE, $input) or die $!;           
my @lines = <FILE>; 
my $count = 0; 

foreach(@lines){ 
    $count++; 
if($_ =~ 'for\('){      # I want to check within for() 
     if($_ =~ '#####'){     # how do the check for numbers 
      print "magic number found at line:".$count; 
    } 
    } 
    elif($_ =~ 'if\('){      # I want to check within if() 
     if($_ =~ '#####'){     
      print "magic number found at line:".$count; 
    } 
} 
} 
매직 넘버는 루프와 루프 경우 존재

, 그래서 어떤 소수가 존재하는 경우 브래킷에서 확인 할 또는 16 진수 값.

+0

나는 그것이 훨씬 더 복잡 그'regex' 검사에 비해 생각합니다. 각 절이 다른 줄에있는 'for'는 어떻습니까? 아니면'i' 대신'i345'라는 변수가 있습니까? 몇 가지 문제 만 말하기. – Birei

+0

@Birei 예 사실 ... dnt는 그것에 대해 생각합니다. 그렇다면 다른 방법을 사용하십시오. –

+6

이 코드를 직선으로 처리하고 C 코드를 구문 분석하고 싶지만 질문에 한 번 언급하지 않았습니까? 아마도해야할까요? – TLP

답변

3

- 다시 수정. 이번에는 if 조건으로, 먼저 쌍을 이루는 괄호를 찾은 다음 == 뒤에 숫자를 찾습니다.

필자는 다중 행 조건 테스트를 인식 할 수 있도록 더욱 강력하게 만들었습니다. 그러나 다른 사람이 말했듯이, 이것은 가능한 경우의 100 %를 커버하지 못할 수도 있습니다.

use 5.14.0; 
use warnings; 

my $data = join '', <DATA>; 

my $if = qr/if \s* (\((?: [^()]++ | (?-1))*+ \)) /spx; # matching paired parenthesis 
my $for = qr/for (\s*\(.*?;.*?) (\d+) \s*? ; /spx; #(\d+) is for the Magic Number 

for($data){ 
    while (/$if/g){ 
     my $pat = ${^MATCH}; 
     my $line =()= ${^PREMATCH} =~ /\n/g; 
     # assumes a magic number exists only when '==' is present 
     if ($pat =~ /(.* == \s*)([0-9a-fA-F.]+)\s*\)/x){ 
      my $mn = $2; 
      my $condition = $1; 
      $line +=() = $condition =~ /\n/g; 
      say "Line ", $line + 1," has magic number $mn"; 
     } 
    } 
    while (/$for/g){ 
     my $mn = $2; #Magic Number 
     my $condition = $1; #For counting \n in the MATCH. 
     my $line =()= ${^PREMATCH} =~ /\n/g; #Counting \n in the PREMATCH. 
     $line +=() = $condition =~ /\n/g; 
     say "Line ", $line + 1," has magic number $mn"; 
    } 
} 


__DATA__ 
if(list == 
5)   // here 5 is magic number 

for(int i = 0; i<6 
; 
i++ 
)  //here 6 is magic number 

if(list == 
8)   // here 8 is magic number 

if (IsMirrorSubChainEnable()) 
{ 
    err = ChainCtrlSetMirrorSC(pChainCtrl, pNewRouteInfo); 
} 

ModCallCallbacks((ModT *)pChainCtrl, kDoneVinResetCallback, NULL, 0); 

출력 :

Line 2 has magic number 5 
Line 10 has magic number 8 
Line 4 has magic number 6 
+0

잘 작동합니다. 그러나 사용자 birei가 지적한 것처럼 조건문이 여러 줄이면 원하는 결과를 얻지 못합니다. –

+1

@ Ad-vic : 일부 코드 문제를 찾는 데 도움이되는 비 엄격한 도움이됩니다. 그것이 이것이위한 것이라면, 투자 수익을 생각해보십시오. 이 코드는 간단하며 원하는 것의 75 %를 찾을 수 있습니다. 또한 편집기를 시작하여 수정을 시작하고 더 많은 것을 찾을 수 있습니다. "매직 넘버 파인더 (magic number finder)"의 정확성을 높이려면 고칠 때 시간이 필요합니다. . . –

+0

@ Ad-vic : 코드를보다 강력하게 편집했습니다. –