NOAA-EMC / fv3atm

Other
28 stars 151 forks source link

Incorrect check for out-of-bounds in State_SetScalar #838

Open SamuelTrahanNOAA opened 1 month ago

SamuelTrahanNOAA commented 1 month ago

Description

Bug encountered and investigated by @zhanglikate with debugging help from @DusanJovic-NOAA and myself. Credit goes mostly to zhanglikate who did a fantastic amount of debugging and testing in an impressively short time.

There is an out-of-bounds access (element 0) if one forgets to set these variables in ufs.configure:

This bug is in State_SetScalar here in cpl/module_cplscalars.F90:

       if (scalar_id < 0 .or. scalar_id > flds_scalar_num) then ! <--- bug is here, not detecting scalar_id=0
          call ESMF_LogWrite(trim(subname)//": ERROR in scalar_id", ESMF_LOGMSG_INFO)
          rc = ESMF_FAILURE
          return
       endif
       farrayptr(scalar_id,1) = scalar_value  ! <--- crash is here with scalar_id=0

When one of the three flds_scalar_index_ variables is missing, scalar_id is 0. The "if" block doesn't catch it because it looks for scalar_id < 0 instead of scalar_id <= 0

To Reproduce:

What compilers/machines are you seeing this with? Irrelevant. The bug is clear in the code.

Give explicit steps to reproduce the behavior.

  1. Forget to set flds_scalar_index_ntile
  2. Compile in debug mode
  3. Run a coupled case
  4. Witness the crash

Additional context

The bug started with this commit:

Output

The stack trace:

  0: forrtl: severe (408): fort: (3): Subscript #1 of the array FARRAYPTR has value 0 which is less than the lower bound of 1
   0:
   0: Image              PC                Routine            Line        Source
   0: ufs_model.x        00000000154A2F7F  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000004277D04  module_cplscalars         124  module_cplscalars.F90
   0: ufs_model.x        000000000423F623  module_fcst_grid_         518  module_fcst_grid_comp.F90
   0: ufs_model.x        0000000000AA0B84  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA472F  Unknown               Unknown  Unknown
   0: ufs_model.x        000000000095097A  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000011EDB99  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA1FCA  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000009701B0  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000CA1351  Unknown               Unknown  Unknown
   0: ufs_model.x        000000000425983F  module_fcst_grid_        1266  module_fcst_grid_comp.F90
   0: ufs_model.x        0000000000AA0B84  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA472F  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000950B87  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000011EDB99  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA1FCA  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000009701B0  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000CA1351  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000004224D4C  fv3atm_cap_mod_mp         997  fv3_cap.F90
   0: ufs_model.x        00000000006B00D8  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000006B003A  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000006B06E3  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000004843AB  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000041F0296  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA0B84  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA472F  Unknown               Unknown  Unknown
   0: ufs_model.x        000000000095097A  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000011EDB99  Unknown               Unknown  Unknown
   0: ufs_model.x        0000000000AA1FCA  Unknown               Unknown  Unknown
   0: ufs_model.x        00000000009701B0  Unknown               Unknown  Unknown
SamuelTrahanNOAA commented 1 month ago

Pinging @DeniseWorthen, who knows the relevant section of code well.

DeniseWorthen commented 1 month ago

Thanks for the work on this while I was away. I agree the check should be <=0.