2012-11-16 2 views
0

하위 함수 내에서 printf를 호출하면 액세스 위반이 발생합니다.subfunction에서 printf 액세스 위반 - Ansi C90

프로그램 크기가 매우 큽니다. 하지만 난 subfunction 전화 만 만들어진 지점으로 문제를 격리 할 수있었습니다.

printf ("test")와 같은 리터럴 상수를 사용하여 printf를 호출하여 시스템을 중단시킬 수 있습니다. 일부 다른 사람들은 printf에 이상한 객체를 제공하여 위반에 액세스했습니다. 이는 여기에 해당하지 않습니다. 내 stachtrace에서

subfunction() 
{ 
    printf("all works great"); //Access Violation 

    //some other calls here 
} 

void main() 
{ 
    otherfunctions(); // 
    printf("all works great"); 
    subfunction();   
    //some more calls here 
} 

:

msvcr100d.dll!_chkstk() 
msvcr100d.dll!_write(int fh, const void * buf, unsigned int cnt) 
msvcr100d.dll!_flush(_iobuf * str) 
msvcr100d.dll!_ftbuf(int flag, _iobuf * str) 
msvcr100d.dll!printf(const char * format, ...) 

코드 C90 코드이며, VS2010로 컴파일 여기

은 일부 의사입니다. 그것은 C90으로 취급되어야합니다. 리팩토링 후 모든 _ (v) snprintf가 _ (v) snprintf_s와 대체되었습니다. 이것이 영향을 미쳤다면 나는 확신하지 못한다.

버퍼에 아무 것도 쓰기 전에 버퍼가 비워지고 있다고 생각합니다.

어떻게하면 더 자세히 조사 할 수 있습니까? 다른 코드가 printf와 충돌 할 수있는 시스템 설정은 무엇입니까?

+0

것은 당신은 아마 다른 곳에서 스택 손상했다. 이 코드는 괜찮은 것 같습니다. 일부 동적 코드 분석 도구를 사용하여 액세스 위반을 추적 해보십시오. 또한 VS에서 "디버그"를 사용하여 코드를 실행 해보십시오. –

답변

0

실수로 printf가 문자열을 출력 할 것으로 예상했지만 실제로는 문자열이 아닌 문자열이 전달되었습니다.

Ansi-C의 경우 보통 캡슐 문자열에 구조를 씁니다. 이것은 나를 발견하기 어렵다

void mistake(void){ 
    TString str; 
    TStrnig_Construct(&str); 
    prtinf("%s", str); 
    TString_Destuct(&str); 
} 

str을 문자열처럼 정말 외모부터 :

typedef struct TString{ 
    char buffer[2000]; 
}TString; 

내가 작성하는 경향이있다. 실제로 str은 문자열이 아니라 구조입니다. 이 오류는 특히 구조의 내용이 다른 정보 (예 : size_t size)로 확장되는 경우 어디에서나 나타날 수 있습니다.

은 내가 쓴해야합니다

void corrected(void){ 
    TString str; 
    TStrnig_Construct(&str); 
    prtinf("%s", str.buffer); 
    TString_Destuct(&str); 
}