2016-02-23 37 views
1

我有我的PETSc中应用程序的坏终止。我已经查了一下是怎么回事Valgrind的,但我不明白它的报告:为什么Valgrind的报告尺寸8对PETSc的一个char *的转让无效写?

==97331== Invalid write of size 8 
==97331== at 0x10007FED5: PetscHeaderCreate_Private (inherit.c:40) 
==97331== by 0x1013EFE23: TSResilCreate (tsresil.c:525) 
==97331== by 0x10139A877: TSGetResil (ts.c:5252) 
==97331== by 0x10138D17E: TSSetFromOptions (ts.c:421) 
==97331== by 0x100011A47: SolveODE (in ./ex31) 
==97331== by 0x100012E98: main (in ./ex31) 
==97331== Address 0x102dde080 is 1,776 bytes inside a block of size 1,780 alloc'd 
==97331== at 0x100025EA1: malloc (vg_replace_malloc.c:303) 
==97331== by 0x10010E8C1: PetscMallocAlign (mal.c:34) 
==97331== by 0x10011063D: PetscTrMallocDefault (mtr.c:188) 
==97331== by 0x1013EFDA0: TSResilCreate (tsresil.c:525) 
==97331== by 0x10139A877: TSGetResil (ts.c:5252) 
==97331== by 0x10138D17E: TSSetFromOptions (ts.c:421) 
==97331== by 0x100011A47: SolveODE (in ./ex31) 
==97331== by 0x100012E98: main (in ./ex31) 

在tsresil.c:525(我在PETSc中实现):

ierr = PetscHeaderCreate(resil,TSRESIL_CLASSID,"TSResil","Time stepping resilience","TS",comm,TSResilDestroy,TSResilView);CHKERRQ(ierr); 

在inherit.c :

22: /* 
23: PetscHeaderCreate_Private - Creates a base PETSc object header and fills 
24: in the default values. Called by the macro PetscHeaderCreate(). 
25: */ 
26: PetscErrorCode PetscHeaderCreate_Private(PetscObject h,PetscClassId classid,const char class_name[],const char descr[],const char mansec[], 
27:           MPI_Comm comm,PetscObjectDestroyFunction destroy,PetscObjectViewFunction view) 
28: { 
29: static PetscInt idcnt = 1; 
30: PetscErrorCode ierr; 
31: #if defined(PETSC_USE_LOG) 
32: PetscObject  *newPetscObjects; 
33: PetscInt   newPetscObjectsMaxCounts,i; 
34: #endif 

37: h->classid    = classid; 
38: h->type     = 0; 
39: h->class_name   = (char*)class_name; 
40: h->description   = (char*)descr; 
41: h->mansec    = (char*)mansec; 

... 

甲PetscObject是一个指向:

typedef struct _p_PetscObject { 
    ... 
    char     *class_name; /* for example, "Vec" */ 
    char     *description; 
    ... 

因此,看来问题是关系到char* descr的任务,但我不明白为什么。大小8会通知指针是错误的否?

+1

这很难从上下文告诉,但它看起来像Valgrind是抱怨,因为你只分配1780个字节的PetscObject,而这8个字节写入(起始字节1776)就足以写进你没”记忆分配。请更新问题以显示PetscObject如何分配。 – mpontillo

+0

这很有道理! PetscObject的分配肯定太小了。等一下我会检查 –

+0

你让我走向正确的方向。我不知道但是“所有的PETSc对象都以PETSCHEADER中定义的字段开头。”将PETSCHEADER添加到我的PetscObject中解决了我的问题。 –

回答

1

它看起来像Valgrind是抱怨,因为你只分配1780个字节的PetscObject,而这8个字节写入(开始于1776字节)足以写入到内存中,你没有分配。

你要么需要增加分配的大小,或增加结构的大小,取决于完整定义和分配的方法。