2012-01-16 2 views
-4

나는이 코드를 codeblocks (필자가 가지고있는 컴파일러 만)에 썼다. 그런 행동을 만났을 때. plz 누군가가 왜 이런 일이 CT와 함께 일어나고 있는지 제안하고 싶습니다. 왜 불확실한 가치 상승?

#include <stdio.h> 
int main(int argc,char* argv[]) 
{ 
    int lov[3][2]={0};   
    int ct=0; 
    char* art; 
    if(argc!=4) 
     return 1; 


    art=argv[1]; 
     do 
     { 
      if(*art=='L' & *(art+1)=='o' & *(art+2)=='c') 
      { 
       printf("\n\n (art+3)=%s ,*(art+3)=%c ,*(art+5)=%c",(art+3),*(art+3),*(art+5)); 
       lov[ct][ct]=*(art+3)-48; 
       lov[ct][ct+1]=*(art+5)-48; 
       printf("\nct=%d,lov[x][x]=%d,lov[x][x+1]=%d ",ct,lov[ct][ct],lov[ct][ct+1]); 
       ct++; 
      } 
      art+=3; 
     } 
     while(*(art++)); 
getchar(); 
} 

명령 프롬프트에

-

>Resol.exe Loc2,5 Loc3,8 Loc5,4 
Output:- 


(art+3)=2,5 ,*(art+3)=2 ,*(art+5)=5 
ct=0,lov[x][x]=2,lov[x][x+1]=5 

(art+3)=3,8 ,*(art+3)=3 ,*(art+5)=8 
ct=1,lov[x][x]=3,lov[x][x+1]=8 

(art+3)=5,4 ,*(art+3)=5 ,*(art+5)=4 

CT = 5, LOV [X] [X] = 4,198,582

, LOV [X] [X + 1 ] = 4

왜 ct가 5 (최후의 선)가되는지

+2

귀하의 코드는 매우 의심 방식으로'argv'에 액세스 : 당신은 아마 당신이 겉으로 lov 쓸 시점에서 ct 값을 운명. 'argv'에 접근하기 위해'for' 루프로 변환하는 것을 고려하십시오. – user7116

+0

코드의 목적은 무엇입니까? 나에게 낯선 사람으로서 그것은 전혀 이해가되지 않는다. –

답변

4

I lov 범위를 벗어 났기 때문에 ct이 덮어 쓰여지고있는 것으로 보입니다. 귀하의 컴파일러는 아마도 ctlov을 서로 가까이에 두었습니다. 따라서 ct이 잘못 수정되었습니다.

ct1 일 때 lov[ct][ct+1]으로 작성하면 lov[1][2]입니다. 그 범위 밖입니다. 그러나 다음 번에 lov[2][2]lov[2][3]에 글을 쓰고 그 중 하나가 ct으로 수정되는 원인이됩니다.

lov[ct][ct+1]으로 작성하면 ct == 0에 대해서만 유효합니다. ct의 다른 모든 값은 배열의 범위를 벗어난 액세스를 초래합니다.

이 코드의 혼란스러운 특성 때문에 다른 오류가 발생하더라도 나는 놀랄 것입니다.

+0

퍼펙트 덕분에 스택이 5 개로 덮어 쓴 것처럼 보입니다 .... 감사합니다. – perilbrain

+0

@ sepp2k'lov [1] [2]'조차도 여전히 범위를 벗어나기 때문에 의도하지 않은 동작을합니다 . 그리고 예, 이미 말했듯이'ct'를 수정하는 것은'lov [2] [X]'액세스가 될 것입니다. –

0

lov[3][2] 크기의 배열입니다. ct5이므로 lov[5][5]이 범위를 벗어납니다. 당신이 얻는 것에 대해 어떠한 보증도하지 않습니다.

+0

문제가 ct가 5로가는 이유는 무엇입니까 ??? – perilbrain

2

코드에 여러 가지 문제가 있으며 C가 말하는 것을 수행합니다.


과 같이 포인터를 역 참조하기 전에 : 그들은 모두 유효 여부를

if(*art=='L' & *(art+1)=='o' & *(art+2)=='c') 

당신은 당신이 첫번째 art의 길이를 확인해야합니다 즉, 확인해야합니다.


귀하의 형식 문자열은 아픈이 같은

printf("\n\n (art+3)=%s ,*(art+3)=%c ,*(art+5)=%c",(art+3),*(art+3),*(art+5)); 

즉, 당신이 사용하는 형식 지정 :

a) %s <- art+3 
b) %c <- *(art+3) 
c) %c <- *(art+5) 

가) 읽기 불법 싶게 의도하지 않은 메모리 섹션에이 잠재적으로 유용한 printf -> 정의되지 않은 동작이 발생할 가능성이 있습니다.

b) 잠재적으로 불법 읽기 -> 정의되지 않은 동작이 발생합니다.

c) 잠재적으로 불법 읽기 -> 정의되지 않은 동작이 발생합니다. 그런 다음


,

lov[ct][ct]=*(art+3)-48; 
lov[ct][ct+1]=*(art+5)-48; 

은 아무데도 당신은 ct에 제한을 두지, 그래서 당신은 잠재적 인 불법 작성을받을 수 있습니다 -> 정의되지 않은 행동을 초대.


다음 :

while(*(art++)); 

art 무엇입니까? 어디에서 초기화하셨습니까? 왜 당신이 그것을 증가합니까? 모두


전체 :

lov[ct][ct]=*(art+3)-48; 
lov[ct][ct+1]=*(art+5)-48; 
+1

고마워요 ... 다음 번에 모든 버퍼 보안, 힙 보안으로 코드 3000 줄을 게시 할 예정이며 그곳에는 무엇이든지 있습니다. – perilbrain

+1

@peril brain : 환상적인 코드 게시하지 마십시오. 실제 코드 게시. 표시 한 코드는 잘못되었거나 잘못되었으며 많은 정의되지 않은 동작을합니다. 검사와 보안뿐만 아니라 올바른 코드 (예를 들어 방금 생략 한 것)가 있었 더라면 오류가 발생하지 않았을 것입니다. –