2010-06-08 6 views
-1

예기치 않은 동작으로 고통 받고 있습니다. 여기에 문제 정의가 있습니다 :ansi c 예기치 않은 문제가 있습니까?

나는 UDP 프로토콜을 통해 LAN상에서 통신하는 응용 프로그램을 가지고 있습니다. 텍스트 파일에서 IP 주소와 포트 번호를 읽습니다. 처음에는 IP 주소와 포트 번호가 제대로 작동하지만 시간이 지나면 char 배열에 저장된 IP 주소가 손상되어 쓰레기 값이 발생합니다. 또한 파일 쓰기는 이것에 의해 영향을받습니다. IP 배열에있는 값은 같은 응용 프로그램에서 작성된 텍스트 파일로도 작성됩니다. 문제가 무엇인지 이해할 수 없습니다 - 도와 줄 수 있습니까?

+2

약간의 코드를 게시하십시오 –

+1

-1 언어의 오류를 가정하기 위해 (표준 라이브러리조차도!). 코드에 문제가있어 버퍼가 손상됩니다. – qrdl

답변

7

이것은 거의 확실하게 버퍼 오버플로를 의미합니다. 스택 오버 플로우가 발생할 수도 있습니다. 너무 작은 바이트 배열로 너무 많은 바이트를 읽고, 할당 된 공간의 끝을 지나서 실행하고 다른 데이터 (예 : IP 주소)를 짓밟 으면됩니다.

Linux를 사용하는 경우 valgrind을 사용하여 문제를 진단하는 것이 좋습니다.

+1

당신의 코멘트는 나의 것과 너무 비슷합니다. 그것은 거의 초자연적입니다. ;) – Artelius

7

이것은 아마도 일부 배열 범위를 벗어나는 액세스 때문일 수 있습니다. 초기화되지 않은 포인터 문제 일 수도 있습니다.

Linux를 사용하는 경우 valgrind에서 프로그램을 실행 해보십시오. 모든 배열의 크기가 충분한 지 확인하십시오. 배열 인덱스가 OK인지, 그런 종류인지 확인하려면 assert()을 추가하는 것이 좋습니다.

+1

당신의 대답은 나의 것과 너무 비슷합니다. 그것은 거의 초자연적입니다. –

0

memcpy()를 사용하여 데이터를 복사하는 경우 올바른 크기 매개 변수를 사용하고 있는지 확인하거나 strcpy()를 사용하는 경우 strcpy()에 null 종료 문자열을 전달하는지 확인하십시오. memcpy 또는 strcpy()에 전달 된 끝에 null 문자가없는 문자열은 이러한 함수가 대상 버퍼의 의도 된 경계를 초과하여 쓰고 메모리 손상을 일으킬 수 있습니다. 다른 원인이있을 수 있습니다. 잘못된 종료 조건이있는 루프 등 우리가 볼 수 있도록 여기에 코드를 붙여 넣으십시오.

0

Linux/UNIX의 경우 valgrind를 사용하고 디버거도 동시에 사용하십시오. 오류의 첫 번째 인스턴스에

valgrind --db-attach=yes --db-command=</path/to/gdb -nw %f %p> 

, Valgrind의 디버거를 연결하는 중지하라는 메시지가 표시됩니다 : 실행 해보십시오. 평소 용의자의

커플 :

  1. 확인 당신이 고정 된 크기의 배열을 사용하는 경우. char buf와 같은 것들 [128]; 귀여운 보이지만 인형
  2. 없음 가져 다람쥐()와 풋() 시스템이 당신을 위해 일하는 무엇이든, STL 문자열이나 crope를 사용해보십시오 주님

의 이름으로, 제발 호출하는 것보다 더 나쁘다 수 있습니다.