检测到堆栈粉碎 ***:使用 HEALPix C 子例程终止中止(核心转储)



我正在尝试将python代码转换为C代码。所以我试图翻译那行:

import healpy as hp  
OldTobySensitivMap = hp.read_map('file.fits', dtype=numpy.float64)

这将使用 HEALPix 投影打开 FITS 文件。所以在C中,我使用的是HEALPix库:

#include "chealpix.h"
#include "fitsio.h"
#include <string.h>
int main(int argc, char **argv){
char coordsys[]="G";
char order[]="NESTED";
long nside=0;
float *map;
map=read_healpix_map("file.fits",&nside,coordsys,order);
printf("nside:%ld, coordsys:%s, order:%s",nside,coordsys,order);     
return(0);
}

但是,此代码返回错误:

WARNING: Could not find COORDSYS keyword in in file file.fits
*** stack smashing detected ***: terminated
Program received signal SIGABRT, Aborted.

GDB 调试器输出为:

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff76f5859 in __GI_abort () at abort.c:79
#2  0x00007ffff77603ee in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff788a07c "*** %s ***: terminatedn") at ../sysdeps/posix/libc_fatal.c:155
#3  0x00007ffff7802b4a in __GI___fortify_fail (msg=msg@entry=0x7ffff788a064 "stack smashing detected") at fortify_fail.c:26
#4  0x00007ffff7802b16 in __stack_chk_fail () at stack_chk_fail.c:24
#5  0x00005555555556af in main (argc=1, argv=0x7fffffffdd18) at young_pulsar_pop.c:60

增加字符串的大小,以便:

char coordsys[2024]="G";
char order[2024]="NESTED";

有效,但输出nside:512, coordsys:, order:RING,所以我不太明白是什么导致了堆栈错误。

就像其他用户说的那样,HEALPix 接口对 C 来说似乎很不安全,而且文档真的很差。因此,我想知道我是否不应该简单地将 python 代码嵌入我的 C 程序中。

如果您查看相关文档:

read_healpix_map

此例程从 FITS 文件中读取完整的天空 HEALPix 地图

在 HEALPix 目录树中的位置:src/C/subs/read_healpix_map.c

格式浮点数 *read_healpix_map(字符 *文件,长 *nside,字符 *坐标,字符 *排序)

参数

|
名称&维度 | 种类 | 输入/输出 | 描述 |  read_healpix_map浮出数组,包含从文件中读取的映射  文件字符 IN FITS 文件中包含要读取的满天  nside 长出 HEALPix 地图的分辨率参数  坐标炭化天文坐标系  像素化("C"、"E"或"G"分别代表天体=赤道、黄道或银河系)  排序字符 HEALPix 像素排序("RING"或"NESTED")

我们看到的是coordsysordering是此函数的输出参数。这意味着此函数期望具有定义大小的 char 缓冲区来存储相关的输出字符串。如本文档所述,为coordsys提供的缓冲区应为ASCII字符串char [2]类型(将坐标系存储在一个字符加上 NULL 字节中),ordering应为char [7]类型(最长字符串为"NESTED">,6 个字符加上 NULL 字节)。

使用char coordsys[]="G";char order[]="NESTED";,您将在程序的数据部分中定义字符串。当您使用最长的字符串进行排序时,您应该有足够的空间来存储这两个字符串。

但。

read_healpix_map文档不准确。该函数将TSTRING对象存储在其coordsysordering参数中,因为它的源调用fits_read_key函数,该函数在这些参数中存储TSRING对象。

所以这就是使用"大尺寸"缓冲区工作的原因。

为了避免任何麻烦,最好的办法是直接初始化缓冲区coordsys并使用"G"和"NESTED"的TSTRING对象order。在fitsio.h标头文档中,关键字的最大长度使用FLEN_VALUE定义。所以我建议你使用:

char coordsys[FLEN_VALUE]="G";
char order[FLEN_VALUE]="NESTED";

最新更新