From eab3c4d382fc1aad6e52a4e4fe89f32a0f16bb74 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Sun, 12 Feb 2023 15:08:46 -0500 Subject: [PATCH] better map file error handling --- src/REACTION/fix_bond_react.cpp | 74 +++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index 95f11c7f77..dbdd5116fd 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -2850,7 +2850,7 @@ void FixBondReact::glove_ghostcheck() ghostly = 1; } #endif - + if (ghostly == 1) { ghostly_mega_glove[0][ghostly_num_mega] = rxnID; for (int j = 0; j < onemol->natoms+1; j++) { @@ -3908,6 +3908,7 @@ read map file void FixBondReact::read_map_file(int myrxn) { + int rv; char line[MAXLINE],keyword[MAXLINE]; char *eof,*ptr; @@ -3932,16 +3933,24 @@ void FixBondReact::read_map_file(int myrxn) if (strstr(line,"edgeIDs")) sscanf(line,"%d",&nedge); else if (strstr(line,"equivalences")) { - sscanf(line,"%d",&nequivalent); + rv = sscanf(line,"%d",&nequivalent); + if (rv != 1) error->one(FLERR, "Map file header is incorrectly formatted"); if (nequivalent != onemol->natoms) error->one(FLERR,"Fix bond/react: Number of equivalences in map file must " "equal number of atoms in reaction templates"); } - else if (strstr(line,"deleteIDs")) sscanf(line,"%d",&ndelete); - else if (strstr(line,"createIDs")) sscanf(line,"%d",&ncreate); - else if (strstr(line,"chiralIDs")) sscanf(line,"%d",&nchiral); - else if (strstr(line,"constraints")) { - sscanf(line,"%d",&nconstraints[myrxn]); + else if (strstr(line,"deleteIDs")) { + rv = sscanf(line,"%d",&ndelete); + if (rv != 1) error->one(FLERR, "Map file header is incorrectly formatted"); + } else if (strstr(line,"createIDs")) { + rv = sscanf(line,"%d",&ncreate); + if (rv != 1) error->one(FLERR, "Map file header is incorrectly formatted"); + } else if (strstr(line,"chiralIDs")) { + rv = sscanf(line,"%d",&nchiral); + if (rv != 1) error->one(FLERR, "Map file header is incorrectly formatted"); + } else if (strstr(line,"constraints")) { + rv = sscanf(line,"%d",&nconstraints[myrxn]); + if (rv != 1) error->one(FLERR, "Map file header is incorrectly formatted"); if (maxnconstraints < nconstraints[myrxn]) maxnconstraints = nconstraints[myrxn]; constraints.resize(maxnconstraints, std::vector(nreacts)); } else break; @@ -3961,11 +3970,13 @@ void FixBondReact::read_map_file(int myrxn) if (comm->me == 0) error->warning(FLERR,"Fix bond/react: The BondingIDs section title has been deprecated. Please use InitiatorIDs instead."); bondflag = 1; readline(line); - sscanf(line,"%d",&ibonding[myrxn]); + rv = sscanf(line,"%d",&ibonding[myrxn]); + if (rv != 1) error->one(FLERR, "InitiatorIDs section is incorrectly formatted"); if (ibonding[myrxn] > onemol->natoms) error->one(FLERR,"Fix bond/react: Invalid template atom ID in map file"); readline(line); - sscanf(line,"%d",&jbonding[myrxn]); + rv = sscanf(line,"%d",&jbonding[myrxn]); + if (rv != 1) error->one(FLERR, "InitiatorIDs section is incorrectly formatted"); if (jbonding[myrxn] > onemol->natoms) error->one(FLERR,"Fix bond/react: Invalid template atom ID in map file"); } else if (strcmp(keyword,"EdgeIDs") == 0) { @@ -3996,10 +4007,11 @@ void FixBondReact::EdgeIDs(char *line, int myrxn) { // puts a 1 at edge(edgeID) - int tmp; + int tmp,rv; for (int i = 0; i < nedge; i++) { readline(line); - sscanf(line,"%d",&tmp); + rv = sscanf(line,"%d",&tmp); + if (rv != 1) error->one(FLERR, "EdgeIDs section is incorrectly formatted"); if (tmp > onemol->natoms) error->one(FLERR,"Fix bond/react: Invalid template atom ID in map file"); edge[tmp-1][myrxn] = 1; @@ -4008,11 +4020,11 @@ void FixBondReact::EdgeIDs(char *line, int myrxn) void FixBondReact::Equivalences(char *line, int myrxn) { - int tmp1; - int tmp2; + int tmp1,tmp2,rv; for (int i = 0; i < nequivalent; i++) { readline(line); - sscanf(line,"%d %d",&tmp1,&tmp2); + rv = sscanf(line,"%d %d",&tmp1,&tmp2); + if (rv != 2) error->one(FLERR, "Equivalences section is incorrectly formatted"); if (tmp1 > onemol->natoms || tmp2 > twomol->natoms) error->one(FLERR,"Fix bond/react: Invalid template atom ID in map file"); //equivalences is-> clmn 1: post-reacted, clmn 2: pre-reacted @@ -4026,10 +4038,11 @@ void FixBondReact::Equivalences(char *line, int myrxn) void FixBondReact::DeleteAtoms(char *line, int myrxn) { - int tmp; + int tmp,rv; for (int i = 0; i < ndelete; i++) { readline(line); - sscanf(line,"%d",&tmp); + rv = sscanf(line,"%d",&tmp); + if (rv != 1) error->one(FLERR, "DeleteIDs section is incorrectly formatted"); if (tmp > onemol->natoms) error->one(FLERR,"Fix bond/react: Invalid template atom ID in map file"); delete_atoms[tmp-1][myrxn] = 1; @@ -4039,10 +4052,11 @@ void FixBondReact::DeleteAtoms(char *line, int myrxn) void FixBondReact::CreateAtoms(char *line, int myrxn) { create_atoms_flag[myrxn] = 1; - int tmp; + int tmp,rv; for (int i = 0; i < ncreate; i++) { readline(line); - sscanf(line,"%d",&tmp); + rv = sscanf(line,"%d",&tmp); + if (rv != 1) error->one(FLERR, "CreateIDs section is incorrectly formatted"); create_atoms[tmp-1][myrxn] = 1; } if (twomol->xflag == 0) @@ -4060,10 +4074,11 @@ void FixBondReact::CustomCharges(int ifragment, int myrxn) void FixBondReact::ChiralCenters(char *line, int myrxn) { - int tmp; + int tmp,rv; for (int i = 0; i < nchiral; i++) { readline(line); - sscanf(line,"%d",&tmp); + rv = sscanf(line,"%d",&tmp); + if (rv != 1) error->one(FLERR, "ChiralIDs section is incorrectly formatted"); if (tmp > onemol->natoms) error->one(FLERR,"Fix bond/react: Invalid template atom ID in map file"); chiral_atoms[tmp-1][0][myrxn] = 1; @@ -4093,6 +4108,7 @@ void FixBondReact::ChiralCenters(char *line, int myrxn) void FixBondReact::ReadConstraints(char *line, int myrxn) { + int rv; double tmp[MAXCONARGS]; char **strargs,*ptr,*lptr; memory->create(strargs,MAXCONARGS,MAXLINE,"bond/react:strargs"); @@ -4134,10 +4150,12 @@ void FixBondReact::ReadConstraints(char *line, int myrxn) } if ((ptr = strchr(lptr,')'))) *ptr = '\0'; - sscanf(line,"%s",constraint_type); + rv = sscanf(line,"%s",constraint_type); + if (rv != 1) error->one(FLERR, "Constraints section is incorrectly formatted"); if (strcmp(constraint_type,"distance") == 0) { constraints[i][myrxn].type = DISTANCE; - sscanf(line,"%*s %s %s %lg %lg",strargs[0],strargs[1],&tmp[0],&tmp[1]); + rv = sscanf(line,"%*s %s %s %lg %lg",strargs[0],strargs[1],&tmp[0],&tmp[1]); + if (rv != 4) error->one(FLERR, "Distance constraint is incorrectly formatted"); readID(strargs[0], i, myrxn, 0); readID(strargs[1], i, myrxn, 1); // cutoffs @@ -4145,7 +4163,8 @@ void FixBondReact::ReadConstraints(char *line, int myrxn) constraints[i][myrxn].par[1] = tmp[1]*tmp[1]; } else if (strcmp(constraint_type,"angle") == 0) { constraints[i][myrxn].type = ANGLE; - sscanf(line,"%*s %s %s %s %lg %lg",strargs[0],strargs[1],strargs[2],&tmp[0],&tmp[1]); + rv = sscanf(line,"%*s %s %s %s %lg %lg",strargs[0],strargs[1],strargs[2],&tmp[0],&tmp[1]); + if (rv != 5) error->one(FLERR, "Angle constraint is incorrectly formatted"); readID(strargs[0], i, myrxn, 0); readID(strargs[1], i, myrxn, 1); readID(strargs[2], i, myrxn, 2); @@ -4155,8 +4174,9 @@ void FixBondReact::ReadConstraints(char *line, int myrxn) constraints[i][myrxn].type = DIHEDRAL; tmp[2] = 181.0; // impossible range tmp[3] = 182.0; - sscanf(line,"%*s %s %s %s %s %lg %lg %lg %lg",strargs[0],strargs[1], + rv = sscanf(line,"%*s %s %s %s %s %lg %lg %lg %lg",strargs[0],strargs[1], strargs[2],strargs[3],&tmp[0],&tmp[1],&tmp[2],&tmp[3]); + if (!(rv == 6 || rv == 8)) error->one(FLERR, "Dihedral constraint is incorrectly formatted"); readID(strargs[0], i, myrxn, 0); readID(strargs[1], i, myrxn, 1); readID(strargs[2], i, myrxn, 2); @@ -4168,7 +4188,8 @@ void FixBondReact::ReadConstraints(char *line, int myrxn) } else if (strcmp(constraint_type,"arrhenius") == 0) { constraints[i][myrxn].type = ARRHENIUS; constraints[i][myrxn].par[0] = narrhenius++; - sscanf(line,"%*s %lg %lg %lg %lg",&tmp[0],&tmp[1],&tmp[2],&tmp[3]); + rv = sscanf(line,"%*s %lg %lg %lg %lg",&tmp[0],&tmp[1],&tmp[2],&tmp[3]); + if (rv != 4) error->one(FLERR, "Arrhenius constraint is incorrectly formatted"); constraints[i][myrxn].par[1] = tmp[0]; constraints[i][myrxn].par[2] = tmp[1]; constraints[i][myrxn].par[3] = tmp[2]; @@ -4176,7 +4197,8 @@ void FixBondReact::ReadConstraints(char *line, int myrxn) } else if (strcmp(constraint_type,"rmsd") == 0) { constraints[i][myrxn].type = RMSD; strcpy(strargs[0],"0"); - sscanf(line,"%*s %lg %s",&tmp[0],strargs[0]); + rv = sscanf(line,"%*s %lg %s",&tmp[0],strargs[0]); + if (!(rv == 1 || rv == 2)) error->one(FLERR, "RMSD constraint is incorrectly formatted"); constraints[i][myrxn].par[0] = tmp[0]; // RMSDmax constraints[i][myrxn].id[0] = -1; // optional molecule fragment if (isalpha(strargs[0][0])) {