首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux内核模块赋值不需要强制转换就可以从指针中生成整数。

问linux内核模块赋值不需要强制转换就可以从指针中生成整数。
EN

Stack Overflow用户
提问于 2012-11-10 15:45:03
回答 2查看 1K关注 0票数 1

这是简单的sys_call_table挂钩代码

代码语言:javascript
复制
#include <asm/unistd.h>
#include <linux/autoconf.h>
#include <linux/in.h>
#include <linux/init_task.h>
#include <linux/ip.h>
#include <linux/kernel.h>
#include <linux/kmod.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/skbuff.h>
#include <linux/stddef.h>
#include <linux/string.h>
#include <linux/syscalls.h>
#include <linux/tcp.h>
#include <linux/types.h>
#include <linux/unistd.h>
#include <linux/version.h>
#include <linux/workqueue.h>

ssize_t *sys_call_table = (ssize_t *)0xc0026e04;

asmlinkage ssize_t (*orig_open)(const char *pathname, int flags);

asmlinkage ssize_t hacked_open(const char *pathname, int flags)
{
    printk(KERN_INFO "SYS_OPEN called : %s\n", pathname);
    return orig_open(pathname, flags);
}

int init_module(void)
{
    orig_open = sys_call_table[__NR_open];      /* line 33 */
    sys_call_table[__NR_open] = hacked_open;    /* line 34 */
    return 0;
}

void cleanup_module(void)
{
    sys_call_table[__NR_open] = orig_open;      /* line 40 */
}

MODULE_LICENSE("GPL");

我收到了如下警告

此代码工作正常,但我想删除警告。我该怎么做?

/home/tester/tools/lkm/a.c:在函数‘init_module’中: /home/ cast /tools/lkm/A.C:33:警告:赋值从指针生成整数而不进行强制转换 /home/ cast /tools/lkm/A.C:34:警告:赋值从指针中生成整数而不进行强制转换 /home/tester/tools/lkm/a.c:在“清理模块”功能中: /home/ cast /tools/lkm/A.C:40:警告:赋值从指针中生成整数而不进行强制转换

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-10 15:48:44

如果您想让编译器保持沉默,就必须添加类型转换(即使这经常是个坏主意,这也是编译器将其转换的方式)。

代码语言:javascript
复制
ssize_t *sys_call_table = (ssize_t *)0xc0026e04;

typedef ssize_t (*ftype)(const char *, int);

ftype orig_open;

ssize_t hacked_open(const char *pathname, int flags)
{
    printf("SYS_OPEN called : %s\n", pathname);
    return orig_open(pathname, flags);
}

int init_module(void)
{
    orig_open = (ftype)sys_call_table[__NR_open];
    sys_call_table[__NR_open] = (ssize_t)hacked_open;
    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2012-11-10 15:49:58

当您查看第33行时,您将看到问题所在:

orig_open = sys_call_table__NR_open;

您已经将sys_call_table定义为指向整数的指针。这就是发出警告的原因。其他行也有同样的问题。如果正确定义sys_call_table,则警告将消失。

您至少应该将其定义为指针数组或指向指针的指针,因为如果ssize_t在64位系统上仅为32位,则可能会将64位地址截断为32位整数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13323455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档