gpt4 book ai didi

c - 我可以将什么输入用于系统函数 time() 以使其返回 -1(错误条件)?

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:40 24 4
gpt4 key购买 nike

我正在尝试在 C 中创建一些错误处理代码。我无法找到破坏函数的输入:

time(time_t *tloc)

我想模拟 time() 中断,以便测试我的错误处理代码。我尝试的输入要么没有错误地通过,要么整个程序崩溃(段错误)。我试图产生的一个错误是无法找到日历。在这种情况下,time() 将返回 -1 并将 errno 设置为 14(“错误地址”)。我怎么能在没有内核段错误的情况下强制这个结果呢?

最佳答案

因为现代 x86 linux 内核上的 libc time() function 是使用 vdso 系统调用实现的(参见 man 7 vdso),我们不得不使用一些技巧。

使用vdso,永远不会进入内核。这是针对高频、速度关键的调用(如 timegettimeofday 等)完成的。所有事件都发生在用户空间中。因此,段错误。真正的[非 vdso] 系统调用进行检查并返回所需的错误代码。

我们必须使用 syscall(SYS_time,...) 强制进入内核版本的系统调用。

这是一个示例程序:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/syscall.h>

int opt_t;

int
main(int argc,char **argv)
{
char *cp;
time_t tv;
time_t *tp;

--argc;
++argv;

for (; argc > 0; --argc, ++argv) {
cp = *argv;
if (*cp != '-')
break;

switch (cp[1]) {
case 't':
opt_t = 1;
break;
}
}

tp = (time_t *) 0xC0000000;

// this segfaults due to vdso
if (opt_t) {
printf("using time ...\n");
tv = time(tp);
}

// this returns error code
else {
printf("using syscall ...\n");
tv = syscall(SYS_time,tp);
}

printf("tv=%8.8lX errno=%d -- %s\n",tv,errno,strerror(errno));

return 0;
}

关于c - 我可以将什么输入用于系统函数 time() 以使其返回 -1(错误条件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com