取决于架构的不同行为

亚历克斯

看来我在libc中遇到了一个可能的错误。我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

struct bla
{
    int a,b,c,d;
};

pthread_t tid;

void print (const char *s, const struct bla *fp);

void * thr_fn1 ( void * arg);

int main()
{
    struct bla *bla_main;

    pthread_create (&tid,NULL,thr_fn1,NULL);
    pthread_join (tid, (void *)  &bla_main);
    print ("Old thread: \n",bla_main);
    return 0;
}

void print (const char *s, const struct bla *bla_print)
{
    printf ("%s\n",s);
    printf ("Struct address: %p\n",bla_print);
    printf ("fp.a = %d\n",bla_print->a);
    printf ("fp.b = %d\n",bla_print->b);
    printf ("fp.c = %d\n",bla_print->c);
    printf ("fp.d = %d\n",bla_print->d);
}

void * thr_fn1 ( void * arg)
{
    struct bla *bla_thr;

    bla_thr=  malloc(1);
    bla_thr->a=1;
    bla_thr->b=2;
    bla_thr->c=3;
    bla_thr->d=4;
    print ("Thread 1:\n",bla_thr);
    pthread_exit ((void *) bla_thr);
}

使用gcc -Wall -pthread file.c不会产生错误/警告的编译来完成但是,当我尝试在Raspberry Pi(32位)上运行它时,得到以下输出:

[alex@ArchPi code]$ ./a.out 
Thread 1:

Struct address: 0xb6500468
fp.a = 1
fp.b = 2
fp.c = 3
fp.d = 4
a.out: malloc.c:2365: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)

[alex@ArchPi code]$ file a.out 
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, BuildID[sha1]=33e5d87872f0b40924a709fe266d47f9f011a06c, not stripped

我注意到当我尝试使用-m32编译步骤选项在Intel处理器上运行它以生成32位可执行文件时,会发生相同的情况

alex@debian:~/code$ ./a.out 
Thread 1:

Struct address: 0x804e098
fp.a = 1
fp.b = 2
fp.c = 3
fp.d = 4

a.out: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted


alex@debian:~/code$ file a.out 
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x9966b205f3f6cd3d3a544ea010608e11346f6f9a, not stripped

但是,在Intel上为程序运行64位可执行文件时不会发生这种情况。

alex@debian:~/code$ ./a.out 
Thread 1:

Struct address: 0xb42130
fp.a = 1
fp.b = 2
fp.c = 3
fp.d = 4

Old thread: 

Struct address: 0xb42130
fp.a = 1
fp.b = 2
fp.c = 3
fp.d = 4
alex@debian:~/code$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x4bb04ef61287bfe750a37427bb41b8b1578d74e1, not stripped

那么,这是libc / malloc()中的错误,还是我做错了什么?请告诉我您是否需要更多详细信息。

谢谢

克尼格

您正在分配1个字节,持续4 ints:

bla_thr=  malloc(1);

bla_thr->a=1;
bla_thr->b=2;
bla_thr->c=3;
bla_thr->d=4;

这会调用未定义的行为,因此任何事情都可能发生。该错误在您的代码中,而不是libc中。如果您通过以下方式分配了足够的空间:

bla_thr = malloc(sizeof *bla_thr); // == sizeof(struct bla);

它应该工作。之后不要忘记free()记忆!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

取决于优化选项的不同行为

来自分类Dev

static_assert取决于非类型模板参数(gcc和clang的不同行为)

来自分类Dev

Access修饰符在继承中的不同行为取决于“ this”关键字和模板或缺少模板

来自分类Dev

FastAPI中的不同OpenAPI架构取决于环境

来自分类Dev

不同的CSS样式行为取决于图像样式

来自分类Dev

rsync的不同行为

来自分类Dev

取决于时间的不同背景

来自分类Dev

不同的输出取决于删除

来自分类Dev

取决于时间的不同背景

来自分类Dev

不同的运行时行为取决于程序的启动方式(终端与 Qt Creator)

来自分类Dev

不同的应用行为取决于它的启动方式 - 从游戏市场或电话

来自分类Dev

Laravel RBAC的不同行为

来自分类Dev

异步等待的不同行为

来自分类Dev

异步等待的不同行为

来自分类Dev

功能提升的不同行为

来自分类Dev

WindowsLookAndFeel中的不同行为

来自分类Dev

git fsck的不同行为

来自分类Dev

程序的行为取决于在何处调用fork

来自分类Dev

行为取决于SQL Server版本

来自分类Dev

Powershell的-split行为取决于方法参数

来自分类Dev

行为取决于SQL Server版本

来自分类Dev

不同语言的相同代码的不同行为

来自分类Dev

既是递归的,又取决于其他行为的行为

来自分类Dev

不同结果取决于打印要求

来自分类Dev

取决于页面的不同SearchQuerySet

来自分类Dev

取决于DOCTYPE的HTML(图像)的不同呈现

来自分类Dev

mediainfo-取决于来源的不同渠道

来自分类Dev

不同样式取决于显示的元素

来自分类Dev

Rails Query 不同的顺序取决于列