2016-11-25 7 views
0

저는 대학 프로젝트로 sha1 크래커를 구현하려고합니다. 해시 값에 대한 루프가 다른 값을 시도하고 있습니다.루프에 이전에 선언 된 변수가 없습니다.

for(int a=0; a<26; a++) 
{ 
    for(int b=0; b<26; b++) 
    { 
     for(int c=0; c<26; c++) 
     { 
      for(int d=0; d<26; d++) 
      { 
       for(int e=0; e<26; e++) 
       { 

        for(int f=0; f<26; f++) 
        { 
         result[0]=alphabet[a]; 
         result[1]=alphabet[b]; 
         result[2]=alphabet[c]; 
         result[3]=alphabet[d]; 
         result[4]=alphabet[e]; 
         result[5]=alphabet[f]; 


         //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e); 

         // Declarations 
         uint32_t a,b,c,d,e,temp; 
         uint32_t w[80]= {0}; 
         a=h0; 
         b=h1; 
         c=h2; 
         d=h3; 
         e=h4; 

아래의 코드는 계속 진행중인 SHA-1 코드입니다. 외부의 루프는 모든 옵션에서 6 자 단어를 테스트 할 수 있도록 만들어졌습니다.

첫 번째 for 루프 앞에 선언 선을 이동하려고 시도하지만 (동일한 함수 내에있는 경우에도 C 컴파일러는 변수가 사용되지 않고 해당 변수가 루프 내에서 손실 된 것처럼 프로그램이 충돌 함을 경고합니다. 하지만 성능상의 이유로 매번 새로운 선언을하고 싶지 않습니다. 전역 선언을 시도하면 동일한 문제가 발생하지만 마지막 루프 내에서 선언 된 경우 모든 것이 제대로 작동합니다.

+2

루프 제어 변수는'a' ..'f' ('for (int i = 0; ...)'와 같은 루프에서 정의 됨)입니다. 왜 당신은 내부 상황에서 그것들을 모두 재정의하고 있습니까?또는 루프 외부에서 내부 선언을 이동할 때 내부 루프에 해당 변수가 숨겨져 있으며 가장 바깥 쪽 선언은 모두 사용되지 않습니다. –

+1

변수를 두 번 선언하고 있습니다. 각'for (int x')는 변수를 선언합니다. 루프에서 'uint32_t a, b, c ...'를 이동할 수 있어야하고 첫 번째 'for'AND 앞에 'int'를 제거해야합니다. 각'for '문 – HeatfanJohn

+0

글쎄, 나는 이것을 나중에 정리할 것이다 @JonathanLeffler.Michael walz : 이것은 내 설명의 오타이며 코드에서 올바르게 선언되었다 – chenino

답변

0

신고 대상이 변수가 두 번 반복됩니다. 각각 for(int x이 변수를 선언합니다. uint32_t a,b,c ...을 루프 밖으로 이동하고 첫 번째 for 앞에 있고를 제거해야합니다. 각 for 문에서.

이 (코드가 작동하지 않거나 당신이하고 싶은 일을한다면 당신은 가장 안쪽 루프 내부의 루프 변수를 재설정 할 나타나는 내가 모르는) 컴파일해야합니다

uint32_t a,b,c,d,e,temp; 
uint32_t w[80]= {0}; 

for(a=0; a<26; a++) 
{ 
    for(b=0; b<26; b++) 
    { 
     for(c=0; c<26; c++) 
     { 
      for(d=0; d<26; d++) 
      { 
       for(e=0; e<26; e++) 
       { 

        for(f=0; f<26; f++) 
        { 
         result[0]=alphabet[a]; 
         result[1]=alphabet[b]; 
         result[2]=alphabet[c]; 
         result[3]=alphabet[d]; 
         result[4]=alphabet[e]; 
         result[5]=alphabet[f]; 


         //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e); 

         // Declarations 
         a=h0; 
         b=h1; 
         c=h2; 
         d=h3; 
         e=h4; 

for(int a=0; a<26; a++) 
{ 
    for(int b=0; b<26; b++) 
    { 
     for(int c=0; c<26; c++) 
     { 
      for(int d=0; d<26; d++) 
      { 
       for(int e=0; e<26; e++) 
       { 

        for(int f=0; f<26; f++) 
        { 
         result[0]=alphabet[a]; 
         result[1]=alphabet[b]; 
         result[2]=alphabet[c]; 
         result[3]=alphabet[d]; 
         result[4]=alphabet[e]; 
         result[5]=alphabet[f]; 


         //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e); 

         uint32_t A,B,C,D,E,temp; // var "a" is not "A" 
         uint32_t w[80]= {0}; 


         // Declarations 
         A=h0; 
         B=h1; 
         C=h2; 
         D=h3; 
         E=h4; 
+1

그'a = h0;','b = h1;'등 변경 할당 루프 변수, 나에게 물고기 같아. –

+0

그쪽으로 너. 나는 7 시간 이래로이 일을하고 있고 조금 눈이 멀어 질 수도있다. 그것을 보지 않고 또 다른 시간 동안 에러를 찾았을 것이므로 나를 도와 줘서 고마워. – chenino

+1

이것은 컴파일 될 것이고 실행을 시작할 것이다. ('result','alphabet'과'h0' ..'h4'가 선언되고 초기화된다.). 그러나 내부 루프 본문의 루프 제어 변수를 다시 설정하면 루프의 컨트롤이 완전히 파괴됩니다. 이것은 원래 코드의 문제이지만 적어도 일부 주석 없이는 전파되어서는 안됩니다. 'e' 루프가 반복되는 횟수는 몇 번입니까? 말할 수는 없지만 아마도 26 번은 아닙니다. 'a' ~'d' 반복문에 대해서도 마찬가지입니다. 웬일인지, 코드는'f'로 변경하지 않습니다; 저도 버그 야? –

0

지금 루프에 대한 첫 번째 전에 uint32_t 선언 라인을 이동하려고하면 (하지만 : 당신이 당신의 의견에 말한대로 다음과 같이 또는, 당신은 당신의 루프 변수를 재정의하지 않도록 당신의 변수 이름을 변경해야 여전히 동일한 기능 내에서, C 컴파일러는 변수가 사용되지 않고 해당 변수가 루프 내에서 손실 된 것처럼 프로그램이 충돌 함을 경고합니다.

uint32_t a; uint32_t b; ... uint32_t e; 바깥 쪽, 그리고 int로 재 선언한다; int b; ... int e; uint32_t 유형으로 선언 된 변수는 범위를 벗어납니다. 가장 안쪽 for 루프 내에서 변수 a, b, ..., e는 for 문에 선언 된 변수입니다. 모든 for 루프 후에 int, a, ..., e는 범위를 벗어나 uint32_t 변수가 사용됩니다. 그러나 그들은 원하는 가치에 배정되지 않습니다.

내부 for 루프 안에 uint32_t 선언을 넣으면 uint32_t의 범위가 잘못되어 해당 int가 범위를 벗어납니다 (또는 "재정의"라고 말해야합니까?).

성능상의 이유로, 나는 매번 새로운 것을 선언하고 싶지 않습니다.

현재 중첩 루프를 실제로 유지하려는 경우 컴파일러에서 최적화하도록하십시오. 변수는 내부 루프가 실행될 때마다 다시 선언되지 않습니다. 결과 어셈블리 코드를 비교할 수 있습니다. 그렇지 않으면 @JonathanLeffler의 조언을 고려하여 코드를 더 쉽게 읽을 수있는 함수로 분리하십시오.

실수를 저질렀다면 주저하지 말고 저주 해주세요. 고맙습니다!