Troy,
In VerseKey::checkBounds()
void VerseKey::checkBounds() {

        long i = getIndex();

        initBounds();
        if (i > upperBound) {
                setIndex(upperBound);
                i = getIndex();
                error = KEYERR_OUTOFBOUNDS;
        }
        if (i < lowerBound) {
                setIndex(lowerBound);
                error = KEYERR_OUTOFBOUNDS;
        }
}

i, upperBound and lowerBound are all -1, when working with a chapter that is 
not in the book. This is good. The proc getIndex() can’t compute the index 
since the chapter is not known so it rightfully returns -1.

I think there should be a check in here like there is in VerseKey.setIndex(int 
iindex).

So
void VerseKey::checkBounds() {

        long i = getIndex();

        // assert we're sane
        if (i < 0) {
                error = KEYERR_OUTOFBOUNDS;
                return;
        }

        initBounds();
        if (i > upperBound) {
                setIndex(upperBound);
                i = getIndex();
                error = KEYERR_OUTOFBOUNDS;
        }
        if (i < lowerBound) {
                setIndex(lowerBound);
                error = KEYERR_OUTOFBOUNDS;
        }
}

What do you think?

DM

> On Jun 15, 2025, at 8:11 AM, DM Smith <dmsm...@crosswire.org> wrote:
> 
> Troy,
> 
> I’ve narrowed it down to turning Auto Normalize off.
> 
> In examples/cmdline/parseverselist.cpp, add parser.setAutoNormalize(false) to 
> see the error with Gen.51.1. Note Gen.50.99 (last chapter with bad verse 
> number) works.
> 
> DM
> 
>> On Jun 12, 2025, at 7:03 PM, DM Smith <dmsm...@crosswire.org> wrote:
>> 
>> Troy,
>> 
>> I’m working on an infinite loop bug in osis2mod.
>> 
>> I’ve narrowed it down to ListKey containing a verse with a chapter which is 
>> beyond the end of a book.
>> 
>> When this happens list.increment(1) never sets an error.
>> 
>> Simplest test case (bit incomplete):
>> 
>> int i = 0;
>> ListKey list = new ListKey();
>> list.add(“Gen.51.1”);
>> for (list = TOP; !list.popError(); list.increment(1)) {
>>      if (i++ > 5) break;
>>      cout << i << list << endl;
>> }
>> 
>> If I change the verse reference to Gen.1.99 (valid chapter, invalid verse), 
>> it works as expected.
>> 
>> Can you figure out the problem?
>> 
>> I’ve got a work around but I’d rather not do that.
>> 
>> Thanks,
>>      DM
>> 
>> _______________________________________________
>> sword-devel mailing list: sword-devel@crosswire.org
>> http://crosswire.org/mailman/listinfo/sword-devel
>> Instructions to unsubscribe/change your settings at above page
> 
> _______________________________________________
> sword-devel mailing list: sword-devel@crosswire.org
> http://crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page

_______________________________________________
sword-devel mailing list: sword-devel@crosswire.org
http://crosswire.org/mailman/listinfo/sword-devel
Instructions to unsubscribe/change your settings at above page

Reply via email to