[petsc-dev] Patch for ksp tutorial ex56

Patrick Sanan patrick.sanan at gmail.com
Tue Mar 31 04:47:48 CDT 2015


I tested this out and the strange behavior is very likely because the C string “sp" is not null-terminated, so there is undefined behavior when using snprintf . On different compilers this adds some extra characters (sometimes newlines as below, but arbitrary characters in general). Replacing sp with a null-terminated string fixed the problem for me:

diff --git a/src/ksp/ksp/examples/tutorials/ex56.c b/src/ksp/ksp/examples/tutorials/ex56.c
index 16278bb..edccd03 100644
--- a/src/ksp/ksp/examples/tutorials/ex56.c
+++ b/src/ksp/ksp/examples/tutorials/ex56.c
@@ -136,9 +136,10 @@ int main(int argc,char **args)
     {
       FILE *file;
       char fname[256];
-      char sp[1];
+      char sp[2];
       const char* petsc_dir  = getenv("PETSC_DIR");
       sp[0] = PETSC_DIR_SEPARATOR;
+      sp[1]='\0';
       if (!petsc_dir) {
         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"'PETSC_DIR' not set.");
       }

Il giorno 11/mar/2015, alle ore 02:12 AM, Hong <hzhang at mcs.anl.gov> ha scritto:

> Sascha:
> I'll replace *.txt file with a C-array to simply ex56.c. 
> Please ignore my previous request.
> 
> Hong
> 
> Hong,
> I do not have an immediate explanation for this. In particular, I wonder why
> there is no line break after 'sp=/' in this line:
> > file = 0x0, sp=/,fname=/Users/Hong/soft/petsc/
> but line breaks in the file path.
> 
> On my machine I tested with make runex56, too. I will look at this again tomorrow.
> Can anyone else confirm this issue?
> 
> Sascha
> 
> 
> 
> On 10 Mar 2015, at 22:22, Hong <hzhang at mcs.anl.gov> wrote:
> 
> > Sascha:
> > I prepared a patch regarding the reading of the data file in ksp tutorial ex56.
> > It sets the path to the data file required for running the example relative to PETSC_DIR
> > instead of relative to the tutorials folder to allow running the example from any folder.
> >
> > Also, I used PETSC_DIR_SEPARATOR instead of the currently hard coded ‘/‘
> > so that the code would also run on a windows machine … if anyone cared.
> > This fails on my MacPro by running 'make runex56':
> >
> > file = 0x0, sp=/,fname=/Users/Hong/soft/petsc/
> > src/
> > ksp/
> > ksp/
> > examples/
> > tutorials/
> > data/
> > elem_3d_elast_v_25.txt
> >         main failed to open input file '/Users/Hong/soft/petsc/
> >
> > I added
> > file = fopen(fname, "r");
> >       printf("file = %p, sp=%s,fname=%s\n",file,sp,fname);
> >       if (file == 0) {
> >
> > as you see, 'sp=/' is followed by a 'new line'.
> > I do not see this behavior on other machines, e.g., linux or an old iMac.
> > Any suggestion?
> >
> > Hong
> >
> >
> > Please discard the patch if you do not want to change the current behavior.
> >
> > Best,
> > Sascha
> >
> >
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20150331/ba8c22bf/attachment.html>


More information about the petsc-dev mailing list