It's undefined behavior per POSIX so gawk (and others?) treat any invalid start
position as 1. From the gawk manual
(
https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions):
"If start is less than one, substr() treats it as if it was one. (POSIX doesn’t
specify what to do in this case: BWK awk acts this way, and therefore gawk does
too.) If start is greater than the number of characters in the string, substr()
returns the null string. Similarly, if length is present but less than or equal
to zero, the null string is returned."
Ed.