当memcpy本地静态变量时出现分段错误

时间:2014-01-15 00:19:09

标签: c++ c segmentation-fault extern memcpy

我遇到了细分错误,但我不明白为什么。我留下了一堆东西(希望没什么重要的)。有趣的是,它运行良好,0错误,valgrind完全泄漏检查。这里是所有信息(我正在使用我在网上找到的代码处理随机数生成器):

file1.h

#ifdef __cplusplus
extern "C" {
#endif

#define STATE_N (19937 / 128 + 1)

union W128_T {
   uint32_t u[4];
   uint64_t u64[2];
};

typedef union W128_T w128_t;

struct STATE_T {
    w128_t state[STATE_N];
    int index;
};

typedef struct STATE_T state_t;

#ifdef __cplusplus
}
#endif

使用以下命令将其编译为静态lib:

gcc -c -O3 -finline-functions -fomit-frame-pointer -DNDEBUG -fno-strict-aliasing --param max-inline-insns-single=1800 -fPIC -Wmissing-prototypes -Wall -std=c99 src/file1.c -o obj/file1.o
ar rc lib/librand.a obj/file1.o

file2.h

#include "../rand/include/file1.h"

#ifdef __cplusplus
extern "C" {
#endif

state_t * rstate(void);

#ifdef __cplusplus
};
#endif

file2.cpp

#include "file2.h"

static state_t rngState;

state_t * rstate(void) {
   return &rngState;
}

使用以下命令将文件2编译成静态库(省略一些内容)(来自cmake,运行make VERBOSE = 1:

/usr/bin/c++ -I/home/random/File1include -I/home/file2include -o CMakeFiles/file2Lib.dir/src/file2.o -c /home/src/file2.cpp

然后我在这个小测试程序test.cpp中测试了所有内容:

#include "file2.h"
#include <cstring>

int main(void) 
{
   state_t * state = rstate();
   state_t save;

   memcpy(&save, state, sizeof(save)); //segmentation fault
}

我使用以下命令构建(省略的东西):

g++ -I/home/random/File1include -I/home/file2include -L/home/file2Lib.dir -Wall -g test.o test.cpp
g++ -I/home/random/File1include -I/home/file2include -L/home/file2Lib.dir -Wall -g test.o -lfile2Lib -o randomTest

如果我将test.cpp改为此,它可以正常工作:

#include "file2.h"
#include <cstring>

int main(void) 
{
   state_t * state = new state_t();
   state = rstate();
   state_t save;

   memcpy(&save, state, sizeof(save));
}

如果我单独离开test.cpp并将file2.h更改为:

#include "../rand/include/file1.h"

#ifdef __cplusplus
extern "C" {
#endif

state_t * rstate(void);
state_t rngState;

#ifdef __cplusplus
};
#endif

将file2.cpp更改为:

#include "file2.h"

state_t * rstate(void) {
   return &rngState;
}

该程序也正常运行。最后,如果我将file2.h更改为:

#include "../rand/include/file1.h"

#ifdef __cplusplus
extern "C" {
#endif

state_t * rstate(void);
extern state_t rngState;

#ifdef __cplusplus
};
#endif

和file2.cpp:

#include "file2.h"

state_t rngState;

state_t * rstate(void) {
   return &rngState;
}

它在测试程序中也有一个seg错误。

此外,seg错误发生在位置state->state[34]。当我尝试打印state->state[34].u[0]时,例如。

这里有什么想法吗?

0 个答案:

没有答案