[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] devel: fix segfault by unset 'assoc[${x[0]}]'

From: Koichi Murase
Subject: Re: [PATCH] devel: fix segfault by unset 'assoc[${x[0]}]'
Date: Thu, 7 Oct 2021 11:47:06 +0900

> I'd like the default behavior to be closer to what it is when
> assoc_expand_once is enabled, as I said back in March. I think it's
> going to be better for users in the long run.

Does that mean the behavior with `assoc_expand_once' being disabled
also modified in a way incompatible with older Bash versions?  I have
been thinking that `shopt -s assoc_expand_once' would be the default
in the future keeping the behavior of `shopt -u assoc_expand_once'.

If the behavior of `shopt -u assoc_expand_once' would also be
modified, I would like to request another switch for the
backward-compatible behavior, in particular, a specific shopt switch
(but not a setting something like `BASH_COMPAT=51' which would involve
other behavior changes). Anyway, we need to maintain the code of the
backward-compatible behavior.

> Only that I'd like a more comprehensive behavioral change. Your fix
> is fine for the limited scope it tackles (resolving the discrepancy
> between valid_array_reference and unbind_array_element).

I see.

> > Yes, but I feel like this is another design issue which is irrelevant
> > for the fix of the present small problem.
> Sure, but that's why we're talking through the issue. Your fix is
> fine for the problem it intends to solve, now I'd like to go beyond
> it and figure out a better architectural solution.

I see.  In order to make such architectural changes, I feel we first
need to determine how the behavior should be changed.  I guess such a
discussion would be again as long as the one in March.  Maybe this
would become just a repetition of the discussion in March, but to

* I still feel that the cleanest solution is to introduce a special
  the syntax-level rule for `unset arr[...]' where the part `arr[...]'
  is treated as if the right-hand side of a variable assignment (just
  like in other assignment builtins such as `declare', `local',
  `export', etc.), i.e., pathname expansions and word splitting is not
  performed on the arguments of the form `name[xxx]'.

  This might be also useful to distinguish the all-element unset «
  unset a[@] » from the unset of the element of key='@' « unset a['@']

  But the problem might be that this may require non-trivial changes
  to the existing codebase.

* I would like to request a backward-compatible mode where the extra
  expansions of array subscripts are performed the same as the older
  versions of Bash.  I would like to see a specific option for this
  mode rather than `BASH_COMPAT=51' which would involve other
  behavioral changes.

* I feel we need to care about the consistency with the extra
  expansions performed in other contexts:

  - printf -v 'a[$key]'
  - read 'a[$key]'
  - declare 'a[$key]=1'
  - vref='a[$key]'; echo "${!vref}"
  - declare -n nref='a[$key]'
  - etc.

> a better architectural solution.

This will not change the observable behavior, but if I would refactor
it, I'd make `valid_array_referecen' return the extracted subscript
and let `unbind_array_element' just receive the extracted subscript
rather than make `unbind_array_element' again extract the subscript.
I attach a patch `r0029-0002b-refactor-unset.patch' to illustrate this
strategy.  This patch bases on the current devel branch.  This patch
gives an alternative solution for the following patches (sorry if you
have already applied some of them):

- `0002-allow-nesting-and-quoting-in-assoc-subscripts-when-a.patch' in
- `0001-arrayfunc.c-unset_array_element-fix-a-bug-that-the-f.patch' in


Attachment: r0029-0002b-refactor-unset.patch
Description: Binary data

reply via email to

[Prev in Thread] Current Thread [Next in Thread]