页次: 1
尝试用%s输出空指针:
#include <stdio.h>
int main (void)
{
printf("%s\n", NULL);
return 0;
}
clang:
cuihao@cuihao-arch /tmp $ clang test.c
cuihao@cuihao-arch /tmp $ ./a.out
(null)
pathcc:
cuihao@cuihao-arch /tmp $ pathcc test.c
cuihao@cuihao-arch /tmp $ ./a.out
(null)
gcc:
cuihao@cuihao-arch /tmp $ gcc test.c
test.c: 在函数‘main’中:
test.c:5:5: 警告:对空指针指向内容的读操作(实参 2) [-Wformat]
test.c:5:5: 警告:格式 ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘void *’ [-Wformat]
cuihao@cuihao-arch /tmp $ ./a.out
[1] 5428 segmentation fault ./a.out
g++:
cuihao@cuihao-arch /tmp $ g++ test.c
test.c: 在函数‘int main()’中:
test.c:5:24: 警告:格式 ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘long int’ [-Wformat]
cuihao@cuihao-arch /tmp $ ./a.out
(null)
貌似除了gcc,都输出“(null)”,这是什么道理?
Site: CVHC.CC Twitter: @cuihaoleo Org: LUG@USTC
AD: ~欢迎参与志愿计算~
离线
我编译时没有警告耶……
Giumo Clanjor (哆啦比猫/兰威举)
Where there is a hacker, there is art. | Dogfooding myself. (C++ / Lua / Perl / Rust)
离线
仔细看了一下,G++的提示说:
but argument 2 has type ‘long int’
为啥是long int呢 :em04
Site: CVHC.CC Twitter: @cuihaoleo Org: LUG@USTC
AD: ~欢迎参与志愿计算~
离线
仔细看了一下,G++的提示说:
but argument 2 has type ‘long int’
为啥是long int呢 :em04
在 32bit/64bit 机器上,long int = long = int = 32bit,在 32bit CPU的 16bit 模式下 int = 16bit, long int = long = 32bit
于是乎,为了兼容性,指针都被定义为 long int
Giumo Clanjor (哆啦比猫/兰威举)
Where there is a hacker, there is art. | Dogfooding myself. (C++ / Lua / Perl / Rust)
离线
如果printf ("(null)\n");那就是都是null了。。
离线
如果printf ("(null)\n");那就是都是null了。。
:em38 好智慧啊
Site: CVHC.CC Twitter: @cuihaoleo Org: LUG@USTC
AD: ~欢迎参与志愿计算~
离线
gcc
直接段错误
不知道LZ的gcc什么版本?
clang
(null)
这个依赖具体的libc实现。
just for fun :-)
离线
tusooa 说:如果printf ("(null)\n");那就是都是null了。。
:em38 好智慧啊
让我想起了骗分导论
我的个人小站:https://elephantus.moe
求来访。
离线
.file "a.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $0, (%esp)
call puts
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.6.2 20111125 (prerelease)"
.section .note.GNU-stack,"",@progbits
看清楚了,调用的是 puts!
离线
puts
你优化了吧
just for fun :-)
离线
百合仙子 说:puts
你优化了吧
木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。
离线
walle 说:百合仙子 说:puts
你优化了吧
木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。
那你指定-O0试试
just for fun :-)
离线
百合仙子 说:walle 说:你优化了吧
木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。
那你指定-O0试试
没有改变。依旧 call puts。
离线
walle 说:百合仙子 说:木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。
那你指定-O0试试
没有改变。依旧 call puts。
那奇怪了,编译器本来在无优化下是不能搞这些小聪明的。你试试把printf的参数写复杂一些,比如%s%d%c%f,....复杂一些 :em27
just for fun :-)
离线
页次: 1