2007-07-05

修改常量字符串导致的 segmentation fault

昨天一同事遇到的问题, 帮他解决了一下, 备忘 :-)


$ cat foo.c
#include

int main(int argc, char *argv[])
{
char *s = "foo;bar;car";

strtok(s, ";");

return 0;
}
$ gcc foo.c
$ ./a.out
Segmentation fault
$ gcc -S foo.c
$ cat foo.s
.file "foo.c"
.section .rodata ; read only data (?)
.LC0:
.string "foo;bar;car"
.LC1:
.string ";"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl $.LC0, -4(%ebp)
movl $.LC1, 4(%esp)
movl -4(%ebp), %eax
movl %eax, (%esp)
call strtok
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)"
.section .note.GNU-stack,"",@progbits
$

No comments: