C:控制到达非void函数的结尾......即使它返回int?

时间:2015-07-01 18:34:01

标签: c linux ubuntu linux-device-driver

我正在用C编写一个字符设备(对于linux)。我有这个功能:

static ssize_t
device_write(struct file *file,
     const char __user * buffer, size_t length, loff_t * offset)
{
    int i, fd = 0;
    int = bytes_written;

    fd = open(file, O_WRONLY);

    printk("device_write(%p,%d)\n", file, length);

    for (i = 0; i < length && i < BUF_LEN-1; i++)
        get_user(Message[i], buffer + i);

    bytes_written = write(fd,Message,i);
    Message[BUF_LEN-1] = '\0';
    /* return the number of input characters used */
    return bytes_written;
}

当我编译时,我得到错误:控制到达非void函数的结束。我已经仔细检查过我正在编写正确的程序,这让我疯狂。

欢迎任何帮助。

另外,稍微不相关,但是可以将char缓冲区初始化为某个字符串(例如char buffer[1000] = "HELLO")吗?

2 个答案:

答案 0 :(得分:2)

该功能有很多问题

  1. 这是无效的

    int = bytes_written;
    

    也许你的意思是

    int bytes_written;
    
  2. 您必须检查fd != -1open()后面的任何代码&#34; 可能&#34;导致无效的文件描述符错误,因为您无法保证fd是有效的描述符。

    你甚至无法知道错误是否已设定,因为

    1. 您无需检查write()是否成功。
    2. 您无法在每次通话后检查errno的价值是什么,可以设置它的值!= 0,即open()和{{1} }。
  3. write()很可能是错误的,它会是Message[BUF_LEN-1] = '\0';;

    这似乎合乎逻辑

    Message[i - 1] = '\0'
  4. 由@ zwol评论,您无法从内核空间使用memcpy(Message, buffer, length); Message[length] = '\0'; open()

答案 1 :(得分:0)

int = bytes_written;至少要int bytes_written;来修复您当前的错误。可能还有其他人。