포인터에 관한 문제...

bakdorazi의 이미지

 struct examTable_entry{
  char   name;
  char   old_name ;
  long   num1;
  long   old_num1;
  long   num2;
  long   old_num2;
 
  int    valid;
  struct examTable_entry * next;  
 
};

위의 구조체 값을 아래의 함수에 대입할 때

int snmp_set_var_value ( netsnmp_variable_list *  vars, const void *  value, size_t  len)

netsnmp_variable_list 구조체는 아래와 같습니다.

struct variable_list *  next_variable 
  NULL for last variable. 
 
oid *  name 
  Object identifier of variable. 
 
size_t  name_length 
  number of subid's in name 
 
u_char  type 
  ASN type of variable. 
 
netsnmp_vardata  val 
  value of variable 
 
size_t  val_len 
  the length of the value to be copied into buf 
 
oid  name_loc [MAX_OID_LEN] 
  90 percentile < 24. 
 
u_char  buf [40] 
  90 percentile < 40. 
 
void *  data 
  (Opaque) hook for additional data 
 
void(*  dataFreeHook )(void *) 
  callback to free above 
 
int  index 

아래의 함수에서 표시한 부분이 에러가 납니다.

netsnmp_variable_list *
examTable_get_next_data_point(void **my_loop_context,
                              void **my_data_context,
                              netsnmp_variable_list * put_index_data,
                              netsnmp_iterator_info *mydata)
{
    struct examTable_entry *entry = (struct examTable_entry *)*my_loop_context;
    netsnmp_variable_list *idx = put_index_data;
 
    if (entry) {
       snmp_set_var_value(idx, (u_char *)entry->name, strlen((u_char *)entry->name)); <== 이 부분에서 에러가 납니다.
        idx = idx->next_variable;
        *my_data_context = (void *) entry;
        *my_loop_context = (void *) entry->next;
    } else {
		return NULL;
    }
}

위의 부분에서
snmp_set_var_value(idx, (u_char *)entry->name, strlen((u_char *)entry->name));
이 부분에서 에러가 납니다.

제가 표시한 부분 외의 다른 부분은 mib2c를 이용해서 NEXCOMM-EXAM-MIB을 이용해서 생성한 소스 입니다.
그러므로 큰 의미를 두시지 않으셔도 될 듯 싶습니다.
제가 추가해 준 부분에서 에러가 나는데요...
내용은 그렇다 치고 데이터 형이 실제 정의한 형이랑 일치하는 지 여부를 판단해 주시면 될 것 같습니다.
제가 포인터가 좀 약하다 보니..이 부분이 제일 어렵네요..
유치한 질문이라고 덮어두지 마시고..아시는 분은 좀 도와주세요..

klara의 이미지

char를 u_char*로 변환할수 있다고 생각하시는 근거가 있나요?
형변환은 만능처럼보이지만 아무것도 해결해주지 않습니다.
형변환은 적당한 변환인지 확신이 있을때만 해야합니다.
그리고 에러가 나면 에러를 올려주세요.

bakdorazi의 이미지

아래 링크에 보시면
snmp_set_var_value를 사용하는 방법에 대해서 나오는데요..

http://www.google.co.kr/codesearch/p?hl=ko#pFm0LxzAWvs/darwinsource/tarballs/other/net_snmp-10.tar.gz%7CqhDAwLBEFkg/net_snmp-10/net-snmp/snmplib/snmp_client.h&q=snmp_set_var_value

int snmp_set_var_value(struct variable_list *, u_char *, size_t);

이렇게 되어 있습니다. 그래서... 위의 함수에 대입하는 2번째 인자값을 u_char * 로 형변환을 해서 썼습니다.

에러는 아래와 같습니다.

[root@localhost Test]# net-snmp-config --compile-subagent nex exam.c
generating the tmporary code file: netsnmptmp.3086.c
void            init_exam(void);
checking for init_exam in exam.c
init_exam(void)
running: gcc  -g -O2 -Dlinux -I/usr/include/rpm  -I. -I/usr/local/include -o nex netsnmptmp.3086.c  exam.c  -L/usr/local/lib -lnetsnmpmibs -lnetsnmpagent -lnetsnmphelpers -lnetsnmp -ldl -lrpm -lrpmio -lpopt  -lz -lcrypto -lm    
exam.c: In function ‘examTable_get_next_data_point’:
exam.c:237: warning: cast to pointer from integer of different size
exam.c:237: warning: passing argument 1 of ‘strlen’ from incompatible pointer type
exam.c:241: warning: cast to pointer from integer of different size
exam.c:241: warning: cast to pointer from integer of different size
removing the tmporary code file: netsnmptmp.3086.c
subagent program nex created

위의 에러에서 exam.c:237 이라는 곳이 제가 에러나는 곳이라고 표시한 부분이구요.
밑에 241줄도 위와 같이 제가 형변환 한 곳입니다.
warning만 났지만 생성된 실행파일 nex를 실행해보면 세그멘테이션 오류 일어납니다.

baboda4u의 이미지

우선 타입케스팅에 대해서는 경고만 발생 했고...세크먼트 폴트의 직접적인 원인은 아닌 거 같습니다.

gdb나 core dump 해 보셔서 정확하게 에러가 나는 포인트를 확인 하시는게 좋을것 같군요...

제 생각에도...name, old name 머 이런 구조체 변수가 포인터가 아닌게 맘에 걸리는 군요...이름이 'A' 한글자도 아닐꺼이고 ^^

여튼..gdb로 디버깅해 보세요...메모리 참조 에러 같아 보입니다.

============================
Stay Hungry, Stay Foolish

============================
Stay Hungry, Stay Foolish

bakdorazi의 이미지

님 말씀대로 gdb로 디버깅 중인데...
잘 안되는 군요...
소스 코드를 전체 올립니다.
앞서 말씀드렸다시티 위의 소스 대부분은 mib2c 컴파일러로 생성한 소스이며 제가 추가한 부분은 얼마되지 않습니다.
올린 소스에 제가 추가한 부분에 대한 코멘트를 하였습니다..
말씀해 주신 것 참조하여 소스를 수정한 결과 세그먼트오류는 발생하지 않지만 역시나 Failed Object가 발생하고 있습니다.
제가 잘 몰라서 그러니...다시 한 번 봐주시면 좋겠어요...
계속 수정의 수정을 거듭하지만 정말 안되네요...

baboda4u의 이미지

우선 다음 코드는 주의 하셔야 합니다.
/////////////////////////////////////////////
char *ffname;
int lens = sprintf(ffname, "nex");
/////////////////////////////////////////////
size = 필요한 크기 + 1;

char ffname[size];
int lens = sprintf(ffname, "nex");

그리고 수정하셨다는 부분 보면 아래 함수를 호출하는대...넘겨 주는 값 검증을 한번 해 보심이...

아래 함수가 어떻게 구현되어 있는지는 모르겠으나...더이상 제가 봐 드리기는 힘드네요 ㅋㅋ 저도 과업이 있고...그닥

실력이 출중 하지 못하여...^^ 수고 하세요

snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,
(u_char *)ffname,
lens);

============================
Stay Hungry, Stay Foolish

============================
Stay Hungry, Stay Foolish

haze11의 이미지

struct examTable_entry{
char name;
int num1;
int num2;
};

char name 이 아니라 char *name 이 아닐까요?

bakdorazi의 이미지

이어야 한다고 생각하는데요
앞서 말했듯이
위의 소스는 mib2c라는 걸로 생성한 소스입니다.

그래서 위의 구조체도 mib2c가 만든 거거든요...
제가 추가한 부분은 위에 표시한 부분밖에 없습니다.

char *name이 되어야 할 것 같은데 char name로 해서 소스를 수정하려고 하니 자꾸 문제가 생기는 것 같애요...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.