gpt4 book ai didi

linux - 为什么这段代码可以在 Linux 上运行,但不能在 SunOS 上运行?

转载 作者:太空狗 更新时间:2023-10-29 11:23:40 27 4
gpt4 key购买 nike

#include <stdio.h>

int main() {
char *str = "11111111-22222222 r-xp 00000000 00:0e 1843624 /lib/libdl.so.0";
unsigned long long start_addr, stop_addr, offset;
char* access = NULL;
char* filename = NULL;
sscanf(str, "%llx-%llx %m[-rwxp] %llx %*[:0-9a-f] %*d %ms",
&start_addr, &stop_addr, &access, &offset, &filename);

printf("\n start : %x, stop : %x, offset : %x\n",start_addr,stop_addr,offset);
printf("\n Permission : %s\n",access);
printf("\n Filename : %s\n",filename);
return 0;
}

在 Linux 上,这给出了正确的输出,但在 Solaris 上,该文件称为 libdl.so(Solaris 上没有 libdl.so.0)所以我想知道是什么造成了这种差异,Solaris 上没有这个文件,如果我更改为 Solaris 安装 (libdl.so) 的文件名,然后它会生成段错误。

$ cc Cperm.c ;./a.out 
Cperm.c: I funktion "main":
Cperm.c:11:3: varning: format "%x" förväntar sig argument av typen "unsigned int", men argument 2 har typen "long long unsigned int" [-Wformat]
Cperm.c:11:3: varning: format "%x" förväntar sig argument av typen "unsigned int", men argument 3 har typen "long long unsigned int" [-Wformat]
Cperm.c:11:3: varning: format "%x" förväntar sig argument av typen "unsigned int", men argument 4 har typen "long long unsigned int" [-Wformat]

start : 11111111, stop : 22222222, offset : 0

Permission : r-xp

Filename : /lib/libdl.so.0

上面是在 ubuntu 上,这里是在 Solaris 上,它在没有警告的情况下编译但产生了段错误:

uname -a
SunOS 5.10 Generic_148888-03 sun4u sparc SUNW,Ultra-4
my:~>cc Cperm.c;./a.out

start : 0, stop : 11111111, offset : 0
Segmentation fault

更新

my:~>uname -a;gcc -Wall Cperm.c
SunOS 5.10 Generic_148888-03 sun4u sparc SUNW,Ultra-4
Cperm.c: In function `main':
Cperm.c:9: warning: unknown conversion type character `m' in format
Cperm.c:9: warning: long long unsigned int format, pointer arg (arg 5)
Cperm.c:9: warning: unknown conversion type character `m' in format
Cperm.c:9: warning: too many arguments for format
Cperm.c:11: warning: unsigned int format, different type arg (arg 2)
Cperm.c:11: warning: unsigned int format, different type arg (arg 3)
Cperm.c:11: warning: unsigned int format, different type arg (arg 4)
my:~>gcc Cperm.c
my:~>

最佳答案

查看 Solaris 10 sscanf 的手册页.那里不支持 %m 修饰符。

您还应该检查 sscanf 的返回值。

关于linux - 为什么这段代码可以在 Linux 上运行,但不能在 SunOS 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16726987/

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