使用OpenMP时snprintf中的分段错误

时间:2014-09-09 15:10:41

标签: c multithreading openmp

我已经读过某个地方,snprintf是线程安全的;但是,当我运行我的代码时,会产生分段错误。

主要功能:

#pragma omp parallel 
{
    #pragma omp for private(j)
    for (i = 0; i < 8; i++) {
        for (j = 0; j < 1; j++) {
            foo(gene_seq); //gene_seq is a large char array
        }
    }
}

错误的代码行:

double foo(char *gene_seq){
    char *seq;

    /* some stuff above */
    region_length = end_pos-init_pos+1; // include \0 terminator
    seq = (char *)safe_malloc(sizeof(char) * region_length);
    snprintf(seq, region_length, "%s", gene_seq + init_pos); //SIGSEGV!!!
    /*more stuff*/
}

编辑将snprintf行周围的程序更新为:

#pragma omp critical
{
    snprintf(seq, region_length, "%s", gene_seq + init_pos);
}

它仍然无法执行。 gdb为变量提供了以下值:

(gdb) p strlen(gene_seq)
$1 = 1405
(gdb) p init_pos
$2 = 683
(gdb) p region_length
$4 = 221   

当我执行单线程程序时它运行正常,而gdb不是很有用。我的glibc版本是2.15。如果需要,将提供更多信息。

1 个答案:

答案 0 :(得分:3)

您是否错过了protoytype safe_malloc() 是否在64位上?

如果&#34;是&#34;编译器假定safe_alloc()返回32位,因此如果指针的值大于2 ^ 32,则返回无效指针。

打开所有警告-Wall -Wextra -pedantic并听取编译器告诉你的内容。