On Fri, Dec 10 2021, Johannes Schindelin wrote: > Hi Peff, > > On Fri, 10 Dec 2021, Jeff King wrote: > >> On Fri, Dec 10, 2021 at 11:22:59AM +0100, Ævar Arnfjörð Bjarmason wrote: >> >> > > Dropping the st_mult() does nothing to fix the actual problem (which is >> > > that this function should use a more appropriate type), but introduces >> > > new failure modes. >> > >> > Yes you're entirely right. I had some stupid blinders on while writing >> > this. FWIW I think I was experimenting with some local macros and >> > conflated a testing of the overflow of n*n in gdb with the caste'd >> > version, which you rightly point out here won't have the overflow issue >> > at all. Sorry. >> >> I'm not sure if this is helpful or not, but this is the minimal fix I >> came up with that runs the testcase I showed earlier. It's basically >> just swapping out "int" for "ssize_t" for any variables we use to index >> the arrays (though note a few are themselves held in arrays, and we have >> to cross some function boundaries). >> >> I won't be surprised if it doesn't hit all cases, or if it even hits a >> few it doesn't need to (e.g., should "phase" be dragged along with "i" >> and "j" in the first hunk?). I mostly did guess-and-check on the >> test-case, fixing whatever segfaulted and then running again until it >> worked. I didn't even really read the code very carefully. >> >> I think you _did_ do more of that careful reading, and broke down the >> refactorings into separate patches in your series. Which is good. So I >> think what we'd want is to pick out those parts of your series that end >> up switching the variable type. My goal in sharing this here is just to >> show that the end result of the fix can (and IMHO should) be around this >> same order of magnitude. > > I am in favor of this patch. Will you have time to submit this with a > commit message? I'd also be happy to pick it up as a massaging of my s/int/intmax_t/ change. I think per[1] that intmax_t is more portable here than ssize_t, but I'm very likely to be missing something. Corrections most welcome. Per [1] I ejected that out of my v2 because I think the "cost" being larger than 1<<16 might not be all that useful. I.e. the limiting that's in get_correspondences(). But I'll happily admit ignorance on how the actual guts of range-diff work, I just wanted to fix a segfault I kept running into locally at some point, and figured I'd submit this RFC. Doesn't an enlargement of the "int" from an assumed 32 bit unsigned to say a 64bit unsigned require that 16bit unsigned COST_MAX to be correspondingly bumped to 32bit unsigned? I.e. we'd define it as 1/2 of whatever "intmax_t" (or "ssize_t" or "long long int" or whatever) is defined as? That may be a question under the umbrella of "Ævar doesn't actually understand range-diff", but think I recall playing with bumping one and not the other (or bumping COST_MAX too close to the size of the container type) and running into errors... 1. https://lore.kernel.org/git/211210.86czm4d3zo.gmgdl@xxxxxxxxxxxxxxxxxxx/