Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在'python3.6';中出现***错误而中止(内核转储):损坏的大小与上一个大小:0x0000000000e018e0***_C_Python 3.x_Swig_Coredump - Fatal编程技术网

C 在'python3.6';中出现***错误而中止(内核转储):损坏的大小与上一个大小:0x0000000000e018e0***

C 在'python3.6';中出现***错误而中止(内核转储):损坏的大小与上一个大小:0x0000000000e018e0***,c,python-3.x,swig,coredump,C,Python 3.x,Swig,Coredump,我正在尝试使用swig将一个基本的c代码包装到python3中。我正在获取一个长度为3000{0,1}的字符串,将其转换为整数数组,将其终止为长度为1000,并作为字符串返回。 c代码是: swig1.c #include<stdio.h> #include<string.h> #include<stdlib.h> int *bob; static inline void *MallocOrDie(size_t MemSize) { void *Allo

我正在尝试使用swig将一个基本的c代码包装到python3中。我正在获取一个长度为3000{0,1}的字符串,将其转换为整数数组,将其终止为长度为1000,并作为字符串返回。 c代码是:

swig1.c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int *bob;

static inline void *MallocOrDie(size_t MemSize)
{
 void *AllocMem = malloc(MemSize);

 if(!AllocMem && MemSize)
 {
    printf("Could not allocate memory!");
    exit(-1);
 }
 return AllocMem;
}
int* strtoint(char *input)
{

  int j;
  char *bsource;
  char *dest;

  int bit_len=strlen(input);
  bsource=input;

  dest=MallocOrDie(bit_len*sizeof(char)); 
  bob=MallocOrDie(bit_len*sizeof(int));
  for( j=0;j<bit_len;j++,bsource++)
  {       
    bob[j]=atoi(strncpy(dest, bsource, 1));    //converts to integer
   }

  return bob;
 }
 char* exposekey(char *bits)
 { 
 int i;  
 int  *bob_b;
 char *str;
 int exposed_code=1000;
 int bit_len=strlen(bits);
 bob_b=MallocOrDie(bit_len*sizeof(int)); 
 str=MallocOrDie(exposed_code*sizeof(char));   
 bob_b=strtoint(bits);
 for(i=0;i<exposed_code;i++)
 {
  str[i]=bob_b[i]+'0';
  }
  str[exposed_code]='\0';

  return str;
 }
我使用swig包装器编译这些代码的方法是:

swig -python -py3 swig1.i
gcc -fPIC -c swig1.c swig1_wrap.c -lm -I/usr/include/python3.6
ld -shared swig1.o swig1_wrap.o -o _swig1.so
我有一个测试代码,它生成3000个随机字符{0,1},并调用python模块
swig1.exposekey()
。我得到了输出(长度为1000的终止字符串),但在输出后转储了一个中止的内核。我不知道为什么

我正在ubuntu 16.04上使用python3.6和swig3.0

输出:

1011101011001110010001101101000110100000010011100010010000000001111011110111001001011000110011100011010001001010101011000111100000010101101111000101101000011000000101000010111110010011010110001110101011011010101011001011101001001000110111000010000111110000110001110101110000000010010110011101011001001001011010100000010100011000001011110011111000110001010000101001101001011010001011101001000100111011100011100111110111011100001011111101010001011001010110101111000001011110010100011111100000000101001001110010011100010010001010011010010110111001001111010001001110110110001011111010010111000100011001101100011110000110001001101110110110100010110000110111110100001000111101110101101000101011010101110111010110001100001110101010011101001010101100101001100010011111101100001011000000001111011011111110110110100110011110010110101100001010001001101000111110011110011010110100000100011101101111011011001100101011001001001110001001011010000011000011011100101011100110111011010111000010010001111111010111100101
    *** Error in `python3.6': corrupted size vs. prev_size: 0x000000000224e7c0 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f38ba0817e5]
    /lib/x86_64-linux-gnu/libc.so.6(+0x80dfb)[0x7f38ba08adfb]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f38ba08e53c]
    python3.6[0x4f93b7]
    python3.6[0x5153c2]
    python3.6[0x53585a]
    python3.6[0x4dd6af]
    python3.6(_PyGC_CollectNoFail+0x27)[0x5eb657]
    python3.6(PyImport_Cleanup+0x22f)[0x5910ef]
    python3.6(Py_FinalizeEx+0x5c)[0x5e4c3c]
    python3.6(Py_Main+0x392)[0x5eaea2]
    python3.6(main+0xe9)[0x4d2fb9]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f38ba02a830]
    python3.6(_start+0x29)[0x5e3409]

======= Memory map: ========
00400000-007df000 r-xp 00000000 08:01 3676651 /usr/bin/python3.6
009de000-009df000 r--p 003de000 08:01 3676651 /usr/bin/python3.6
009df000-00a7b000 rw-p 003df000 08:01 3676651/usr/bin/python3.6
00a7b000-00aad000 rw-p 00000000 00:00 0 
0219c000-02283000 rw-p 00000000 00:00 0  [heap]
7f38b4000000-7f38b4021000 rw-p 00000000 00:00 0 
7f38b4021000-7f38b8000000 ---p 00000000 00:00 0 
7f38b9207000-7f38b921d000 r-xp 00000000 08:01 7868921  /lib/x86_64-linux-gnu/libgcc_s.so.1
7f38b921d000-7f38b941c000 ---p 00016000 08:01 7868921  /lib/x86_64-linux-gnu/libgcc_s.so.1
7f38b941c000-7f38b941d000 rw-p 00015000 08:01 7868921   /lib/x86_64-linux-gnu/libgcc_s.so.1

此表达式
strncpy(dest,bsource,1)
包含严重缺陷

发件人:

如果在复制整个数组src之前达到计数,则生成的字符数组不会以null结尾

当您将
1
作为“计数”传递时,总是在找到源字符串终止符之前到达该计数,并且不会终止目标。这将导致在您的调用中引入,因为它将查找终止符以了解字符串何时结束

如果要将单个数字从字符转换为相应的整数值,有一种更简单(更安全)的方法:

这是因为C规范保证所有数字在任何编码中都是连续编号的。因此,如果
'0'
是例如
48
(就像它在中一样),那么例如
'3'
必须是
51
。然后
'3'-'0'
等于
51-48
,也就是
3


您还有一些严重的内存泄漏:

bob_b=MallocOrDie(bit_len*sizeof(int)); 
bob_b=strtoint(bits);
首先分配内存并使
bob
指向它,然后(在
stroint
函数中)分配新内存并使
bob
指向该内存。这意味着您将丢失为
bob\u b
分配的原始内存

这还意味着您有两个指向同一内存的指针,一个是本地的
bob\u b
,另一个是全局的
bob
。如果将
bob_b
bob
传递给
free
则尝试释放同一内存两次,这是不允许的,并且会再次导致未定义的行为(通常会导致类似于您的崩溃)

如果您多次调用任何函数,您将泄漏内存,就像打开的谷仓门泄漏未锁的牛一样


我建议您学习如何使用诸如或类似内存调试器之类的工具。

此表达式
strncpy(dest,bsource,1)
包含严重缺陷

发件人:

如果在复制整个数组src之前达到计数,则生成的字符数组不会以null结尾

当您将
1
作为“计数”传递时,总是在找到源字符串终止符之前到达该计数,并且不会终止目标。这将导致在您的调用中引入,因为它将查找终止符以了解字符串何时结束

如果要将单个数字从字符转换为相应的整数值,有一种更简单(更安全)的方法:

这是因为C规范保证所有数字在任何编码中都是连续编号的。因此,如果
'0'
是例如
48
(就像它在中一样),那么例如
'3'
必须是
51
。然后
'3'-'0'
等于
51-48
,也就是
3


您还有一些严重的内存泄漏:

bob_b=MallocOrDie(bit_len*sizeof(int)); 
bob_b=strtoint(bits);
首先分配内存并使
bob
指向它,然后(在
stroint
函数中)分配新内存并使
bob
指向该内存。这意味着您将丢失为
bob\u b
分配的原始内存

这还意味着您有两个指向同一内存的指针,一个是本地的
bob\u b
,另一个是全局的
bob
。如果将
bob_b
bob
传递给
free
则尝试释放同一内存两次,这是不允许的,并且会再次导致未定义的行为(通常会导致类似于您的崩溃)

如果您多次调用任何函数,您将泄漏内存,就像打开的谷仓门泄漏未锁的牛一样


我建议您学习如何使用诸如或类似的内存调试器之类的工具。

未定义行为的第一个实例位于
atoi(strncpy(dest,bsource,1))
strncpy
不是字符串函数,不应使用。在这种情况下,它不会NUL terminate
dest
,因此
atoi
会关闭并读取未初始化的内存。如果您只想将单个数字转换为其数值,请使用
input[j]-“0”
。内存泄漏:
dest
永远不会被释放。内存泄漏:
bob=MallocOrDie(…);bob_b=…
。为什么h*ck是
bob
全局变量?未定义的行为:
str[exposed_code]='\0'写入超出范围。未定义行为的第一个实例位于
atoi(strncpy(dest,bsource,1))
strncpy
不是字符串函数,不应使用。在这种情况下,它不会NUL terminate
dest
,因此
atoi
会关闭并读取未初始化的内存。如果您只想将单个数字转换为其数值,请使用
input[j]-“0”
。内存泄漏:
dest
永远不会被释放。内存泄漏:
bob=MallocOrDie(…);bob_b=…
。为什么h*ck是
bob
全局变量?未定义的行为:
str[exposed_code]='\0'写入超出范围。
bob_b=MallocOrDie(bit_len*sizeof(int)); 
bob_b=strtoint(bits);