日期:2014-05-16  浏览次数:20736 次

大家来帮我看看这个代码,为什么invalid address alignment??
$ cat test.c
#include <stdio.h>
static struct {
  int argc;
  char **argv;
  int len;
} origarg;

static int get_arglen(int argc, char **argv)
{
  char *s = argv[0];
  return 0;
}

  void
ruby_sysinit(int *argc, char ***argv)
{
  origarg.argc = *argc;
  origarg.argv = *argv;
  origarg.len = get_arglen(origarg.argc, origarg.argv);

}

int main()
{
  int fake_argc = 0;
  char* fake_argv[1] = { "" };

  ruby_sysinit(&fake_argc, (char ***)&fake_argv);
  return 0;
}


$ CC -m64 test.c // 去掉-m64就没问题了
$ ./a.out
Bus Error(coredump)

$ CC -V
CC: Sun C++ 5.11 SunOS_sparc 2010/08/13

$ dbx a.out core
t@1 (l@1) program terminated by signal BUS (invalid address alignment)
0x0000000100000a98: get_arglen+0x0008: ldx [%i1], %o0
(dbx) where -h
current thread: t@1
=>[1] get_arglen(0x0, 0x100000d2c, 0xffffffff7ee48240, 0xffffffff7ee49e44, 0xffffffff7eb00200, 0x4), at 0x100000a98
  [2] ruby_sysinit(0xffffffff7ffff154, 0xffffffff7ffff148, 0x1f053c, 0xffffffff7f1085a4, 0xffffffff7ee00700, 0xffffffff7eb00200), at 0x100000af8
  [3] main(0x1, 0xffffffff7ffff218, 0xffffffff7ffff228, 0xffffffff7ec4bb50, 0xffffffff7ee00680, 0xffffffff7eb00200), at 0x100000b60

(dbx) frame 1
Current function is get_arglen
  11 char *s = argv[0];

(dbx) print argv[0]
argv[0] = 0x1 "<bad address 0x0000000000000001>"

(dbx) frame 3
Current function is main
  29 ruby_sysinit(&fake_argc, (char ***)&fake_argv);
   
(dbx) print &fake_argv
&fake_argv = 0xffffffff7ffff068

(dbx) print (char **)fake_argv
dbx: Cannot cast an array
(dbx) print fake_argv
fake_argv = (0x100000db4 "")


大家来帮我看看啊,这为什么会coredump啊?

------解决方案--------------------
void
ruby_sysinit(int *argc, char ***argv)
{
origarg.argc = *argc;
origarg.argv = *argv;
origarg.len = get_arglen(origarg.argc, origarg.argv);

}

int main()
{
int fake_argc = 0;
char* fake_argv[1] = { "" };

ruby_sysinit(&fake_argc, (char ***)&fake_argv);
return 0;
}

楼主这指针学的,一看就不会指针。 你以为多&一下就是多一个*啊 =,=


C/C++ code
#include <stdio.h>
static struct {
          int argc;
            char **argv;
                  int len;
} origarg;

static int get_arglen(int argc, char* *argv)
{
          char *s = argv[0];
            return 0;
}

  void
  ruby_sysinit(int *argc, char* *argv)
{
          origarg.argc = *argc;
            origarg.argv = argv;
                  origarg.len = get_arglen(origarg.argc, origarg.argv);

}

int main()
{
          int fake_argc = 0;
            char* fake_argv[1] = { "" };

                  ruby_sysinit(&fake_argc, fake_argv);
                    return 0;
}

------解决方案--------------------
char* fake_argv[1] 不能转换成三级指针。。。
加个-xmemalign来忽略这个sigbus