On Mon, Feb 12, 2024 at 4:13 PM Chet Ramey <chet.ra...@case.edu> wrote: > > On 2/7/24 2:23 AM, Grisha Levit wrote: > > If a single declare command both sets and unsets the array or assoc > > attribute for an existing scalar variable, the `value' member of the > > SHELL_VAR is assigned an ARRAY* or HASH_TABLE* as appropriate, but > > later ends up treated as a char*: > > > > $ bash-asan -c 'X=Y; declare -A +A X; declare -p X' > > declare -- X=$'\200_\020\005\001' > > > > $ bash-lsan -c 'X=Y; declare -A +A X; X=(Z)' > > ERROR: LeakSanitizer: detected memory leaks > > Direct leak of 1024 byte(s) in 1 object(s) allocated from: > > #0 0xaaaada7342f8 in malloc > > #1 0xaaaada7f24d0 in xmalloc xmalloc.c:107:10 > > #2 0xaaaada7b81fc in hash_create hashlib.c:72:25 > > #3 0xaaaada7cc0c8 in convert_var_to_assoc arrayfunc.c:117:10 > > > > Maybe it would be appropriate to reject a request to turn off an > > attribute that is being turned on? > > Only for indexed and associative arrays, since those are the attributes > that cause changes in the underlying value storage format. That's different > than turning the integer attribute on and off, for instance. > > Should it be an actual error, or should the shell just cancel out the > attribute change requests and go on? What do folks think?
I think it's not obvious what canceling out would mean, e.g. in unset X; X=Y; declare -A +A X=(Z) would canceling out +A and -A mean that X is converted to an indexed array? Would it be an error if X already is an indexed array? And should the order of options matter? It might seem natural to follow the behavior of `set' and apply the options in order, having unset X; X=Y; declare +A -A X=(Z) make an associative array -- but there may be too many complications if vars of multiple types are modified in the same command. And just to add to the test cases: while the above produce 'cannot destroy...' errors, the following segfaults: unset X; X=Y; declare +A -A 'X=(Z)' Segmentation fault: 11 I don't really have a concrete suggestion, it just seems difficult to devise and implement intuitive and consistent behavior for these option combinations, so rejecting them seemed like a safe enough approach.