이런 문제는 어떤 문제인가요?

mabux의 이미지

dmesg 명령어로 확인하는데..

unable to handle kernel NULL pointer derefrence at virtual address 000000da

라는 문구가 눈에 들어오네요..

드라이버 화일 하나 수정하여 모듈 올리고 write하는 부분 테스트를 하였는데.

write부분에서 아마도 먹통이 되는 듯 싶습니다..

write관련 부분 코드도 추가해 봅니다.

char data[10];

data[0] = (char)"0x11";

write(*data, buffer, 0x10, 0);

위의 코드이고 경고 발생합니다.

경고 문구는 "make pointer from integer without a cast"

integer 변수를 사용을 안함에도 불구하고 위와 같은 경고 문구가 나오네요.

그리고 write의 원형은

write(struct file *file, const char *buffer, size_t count, loff_t *ppos);

입니다.

그럼 답변 부탁드리겠습니다.

lsj0713의 이미지

char data[10]; 

data[0] = (char)"0x11"; 

write(*data, buffer, 0x10, 0); 

두번째 줄이 이상하군요. "0x11"이라는 문자열 상수를 가리키는 포인터 주소값을 char 형(정수형)으로 형변환 해서 char형 배열의 한 원소에 저장하는 건 아무런 의미가 없습니다.

세번째 줄도 마찬가지... 올려주신 대로라면 write 함수의 첫번째 매개변수는 file 구조체에 대한 포인터가 되어야 하겠죠.

서지훈의 이미지

char data[10]; 

data[0] = (char)"0x11"; 

write(*data, buffer, 0x10, 0);

경고문구 wrote:
make pointer from integer without a cast

함수원형:
write(struct file *file, const char *buffer, size_t count, loff_t *ppos);

일단 경고 문구 없이, 그리고 바른 코드는...
write((struct file *)data, buff, 0x10, NULL);
뭐... 이정도가 되지 않나 생각이 드는군요.
분명히 write() 함수에서 1,2번째 인자가 pointer인데도 정작 넘겨준건 char 값이니깐 당연히 에러가 납니다.
그리고 0하고 (loff_t *) 0 이건 명백히 틀린 값입니다.
하나는 상수이고, 하나는 포인터 주소이고.
아직 C에서는 이러한 혼용을 허용하지 않는것으로 알고 있습니다.
C++에서는 특별히 확인을 하지 않는 글을 본적은 있는거 같은데...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

방준영의 이미지

서지훈 wrote:
그리고 0하고 (loff_t *) 0 이건 명백히 틀린 값입니다.
하나는 상수이고, 하나는 포인터 주소이고.
아직 C에서는 이러한 혼용을 허용하지 않는것으로 알고 있습니다.

아직이 아니라 C가 세상에 나왔을 때부터 그렇게 써오고 있는데... :cry:

정확하게 얘기하자면 함수 원형이 있어야 합니디만, 함수 원형 선언 없이 함수를 호출한다는 것은 실제 프로그램에선 거의 있을 수 없는 일이기 때문에 논외로 하겠습니다.

lsj0713의 이미지

서지훈 wrote:

그리고 0하고 (loff_t *) 0 이건 명백히 틀린 값입니다.
하나는 상수이고, 하나는 포인터 주소이고.
아직 C에서는 이러한 혼용을 허용하지 않는것으로 알고 있습니다.
C++에서는 특별히 확인을 하지 않는 글을 본적은 있는거 같은데...

C에서도 0은 null pointer constant 입니다. 포인터 변수에 대한 0의 대입, 0과의 비교 모두 허용되고 있으며, 널 포인터 변수의 내부적인 표현이 "모든 비트가 0"이 아닌 환경이라 할지라도 0과 비교했을 시엔 무조건 1이 나오도록 되어 있습니다. 몇몇 C 컴파일러에서 NULL 매크로 상수로 ((void *)0) 식으로 정의해 놓는 것은 프로그래머의 실수를 방지하기 위해서 입니다.

또한 C++에서는 (void *)형에서 다른 포인터 형으로의 암시적인 형변환이 금지되어 있기 때문에 오히려 NULL은 보통 0으로 정의되며, 책에 따라서는 널 포인터 상수가 필요할 때 NULL 대신 그냥 0을 쓰는 것을 권장하기도 합니다.

댓글 달기

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