Empty arrays have undefined behavior
Affects | Status | Importance | Assigned to | Milestone | ||
---|---|---|---|---|---|---|
EPICS Base | Status tracked in 7.0 | |||||
7.0 |
Fix Released
|
Undecided
|
Dirk Zimoch |
Bug Description
The behavior of arrays with 0 elements is inconsistent and seemingly undefined. I made the fllowing observations:
1. Reading empty arrays with caget shows NELM values, all 0 except for the first which sometimes contains strange not-quite-random numbers (see bug report 1242919). I have observed values 0, 2.122e-314, 2.50321e-308, 22, 18, 2.02038e-39, 1441792, 1179648, 3.05948e-308, also depending on the -d option (DBR type) of caget.
2. Reading empty arrays with camonitor shows no values.
3. A scalar input record reading INP or scalar output record reading DOL (with OMSL closed_loop) from an empty array (aai, aao or waveform) does not change its value and does not show an alarm (tested with ai, bi, mbbi, mbbiDirect, longin, stringin, ao, bo, mbbo, mboDirect, longout, stringout). This is true for DB links as well as for CA, CP and CPP links.
4. An array record (aai, waveform) reading from an empty array does not change its current value. It does not change NORD, it does not clear the arrays elements, it does not show an alarm.
5. Writing 0 elements to an array with caput -a fails whith "Invalid element count requested".
My opinion on this behavior is as follows:
1. Reading arrays with caget should return NORD elements, not NELM elements. But if we put this side, the additional elements should all be set to 0. For empty arrays, this includes the the first one (index 0).
2. This is correct behavior.
3. This is consistent but questionable. Converting an empy array to a scalar should fail as there is no value to convert. But that might break existing dbs. In that case this behavior should be documented. (Or is it?)
4. This behavior is buggy. The receiving record should update its NORD to 0.
5. It should be possible to write an empty array.
Related branches
- Andrew Johnson: Approve
- mdavidsaver: Approve
-
Diff: 349 lines (+102/-40)12 files modifieddocumentation/RELEASE_NOTES.md (+36/-0)
modules/ca/src/client/db_access.h (+1/-1)
modules/ca/src/client/nciu.cpp (+2/-2)
modules/database/src/ioc/db/dbAccess.c (+16/-15)
modules/database/src/ioc/db/dbCa.c (+7/-1)
modules/database/src/ioc/db/dbTest.c (+21/-10)
modules/database/src/std/dev/devAaiSoft.c (+8/-3)
modules/database/src/std/dev/devAiSoft.c (+2/-1)
modules/database/src/std/dev/devSASoft.c (+2/-2)
modules/database/src/std/dev/devWfSoft.c (+5/-2)
modules/database/src/std/rec/aSubRecord.c (+1/-2)
modules/database/test/std/rec/regressTest.c (+1/-1)
description: | updated |
Changed in epics-base: | |
status: | New → In Progress |
assignee: | nobody → Dirk Zimoch (dirk.zimoch) |
Problem 1. is partially handled in https:/ /bugs.launchpad .net/epics- base/+bug/ 1242919 - or rather not, considering it's been there for 8 years.