타입 변환 중 오류

indeok84의 이미지

void aThread::converter(unsigned char *ch){
	unsigned char mask = 0x0f;
	char val[4];
	int i;
 
	val[1] = *ch&mask;
	val[0] = *ch>>4;
 
 
	for(i=0;i<2;i++){
		val[i] %= 17;
		if( val[i]/10 ){ 
			val[i] += 87;
			if(val[i] == 'f'){
			    str_dinfo = str_dinfo.append(" ");
			}
		}	// to start from 97
		else{ 
			val[i] += 48;
		}	// to start from 48
	}val[i]=' ';
	val[3]='\0';	
}

패킷 값 1byte씩 넘겨받아 16진수로 변환하는 함수입니다.

가끔씩

val[1] = *ch&mask;

이 부분에서 segmentation fault가 발생하더라고요;

그래서 주소값 말고 값을 복사해서 넘겨주었습니다.(물론 포인터 다 제거했습니다.)

그랬더니 이번엔 호출한 부분

converter(*packet);

에서 아래와 같은 segmentation fault가 발생하네요;;

처음 segmentation fault 도 내용은 같았습니다

스크린샷 파일 첨부했습니다.

이유 아시는 분 알려주시면 감사하겠습니다 ㅠㅠ

수고하세요!!

File attachments: 
첨부파일 크기
Image icon crash.jpg30.33 KB
lugi의 이미지

converter함수를 호출해주는 쪽에 문제가 있는것 같습니다. 파라메터로 넘기는 포인터 변수에 invalid한 주소값이 들어가는것으로 추정되므로, 해당 함수 호출 직전에 packet값을 확인해보세요.

--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

indeok84의 이미지

말이 안되게 길다는거 말고는 이상한점이 없는거 같네요. 그리고 대부분이 00 이라는거 말고는,,

참고로 저 함수 호출은 패킷을 잡은 후 복사 한 값에 대해 이루어 지는것입니다.

머리 아프네요;;

chadr의 이미지

다시 한번 확인해보세요. 분명히 그부분이 이상할겁니다.

메모리 할당이 제대로 안되었다거나 해제한 메모리를 저 포인터가 가르키고 있는게 아닌지
확인해보세요. 그리고 잡은 패킷의 크기가 packet 변수가 가르키는 메모리의 길이보다 큰게
아닌지 확인해보세요.

말도 안되게 길다는 점이 발생할 수 있는 경우인지 확인해보세요. 만약에 발생이 안되어야하는
케이스라면 그것이 문제일 가능성이 높습니다. 대부분의 세그멘테이션 폴트는 할당 받지 않은
메모리를 참조하는 경우에 발생합니다. 따라서 사용하는 메모리가 할당이 되어있는 것인지
따져보시는 것이 문제 해결 방법입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

indeok84의 이미지

문제는 converter(*p) 를 수행시키는 for 루프 조건에 있었습니다.

len < header->caplen 의 조건에서 len 이 unsigned으로 선언이 되어 있었습니다. ( 도대체 언제,,, 왜,,,,,,;;;)

그래서 caplen이 255보다 크면 무한 루프를 돌았던 거구요..

정말 창피하네요 ㅠㅠ

아무튼 답변 감사합니다!!

irondog의 이미지

제가 봤을 때는 접근 할 수 없는 주소값을 *ch로 접근해서 생기는 오류 같네요.
변수 선언 후에 ch가 valid한지 확인하는 코드를 넣어 보시죠.

예를 들면

ASSERT(ch!=NULL);

indeok84의 이미지

segmentation fault 발생되기 전까지

ASSERT "ch!=0" 이렇게 나오더라고요.

즉 ch값은 항상 null이 아니었습니다...

답변 감사합니다

antaran의 이미지

여러분들께서 거의 일관적으로 말씀하셨지만

ch의 값(ch포인터변수가 가르키는 주소값)이 엉뚱하다는 얘기지

ch == NULL 이란 얘기는 아닙니다. 프로그램이 돌다가 포인터 관련 변수에서 죽어버릴 때

포인터 변수 값이 NULL이여서 죽는 경우는 초보일 때 빼곤 흔히 볼 수 없는게 대부분입니다.

버퍼가 모자라서 덮어 써졌거나(대부분) 기타 어떤 원인이 있어 ch가 엉뚱한 곳을 포인팅 하는 것이 분명합니다.

세그멘테이션 폴트가 그렇다는 얘기니까요.

다시 한번 잘 살펴보시기 바랍니다.

indeok84의 이미지

저 분들이 하신 말은 이해 했었는데 도저히 감이 안와서 못 잡고 있었는데
허무하게 잡아냈네요;;

답변 감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.