- 论坛徽章:
- 0
|
本帖最后由 liwangli1983 于 2010-08-09 22:53 编辑
mips平台下编译,运行出现段错误,
看了下汇编代码.果然是在a=字符串这个赋值进行前,就把a原来的值赋给了参数1对应的寄存器.再传递给printf,printf去地址1找字符串了......当然会段错误
这样证实了这确实是一个未定义行为,不同的编译器会做出不同的处理- .file 1 "sss.c"
- .section .mdebug.abi32
- .previous
- .abicalls
- .rdata
- .align 2
- $LC0:
- .ascii "main(a){printf(a,34,a=%c%s%c,34);}\000"
- .text
- .align 2
- .globl main
- .ent main
- .type main, @function
- main:
- .frame $fp,32,$31 # vars= 0, regs= 2/0, args= 16, gp= 8
- .mask 0xc0000000,-4
- .fmask 0x00000000,0
- .set noreorder
- .cpload $25
- .set nomacro
-
- addiu $sp,$sp,-32
- sw $31,28($sp)
- sw $fp,24($sp)
- move $fp,$sp
- .cprestore 16
- sw $4,32($fp)
- lw $3,32($fp)
- lw $2,%got($LC0)($28)
- nop
- addiu $2,$2,%lo($LC0)
- sw $2,32($fp)
- move $4,$3
- li $5,34 # 0x22
- lw $6,32($fp)
- li $7,34 # 0x22
- lw $25,%call16(printf)($28)
- nop
- jalr $25
- nop
- lw $28,16($fp)
- move $sp,$fp
- lw $31,28($sp)
- lw $fp,24($sp)
- addiu $sp,$sp,32
- j $31
- nop
- .set macro
- .set reorder
- .end main
- .ident "GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)"
复制代码 |
|