[sword-devel] Odd behavior in ListKey

DM Smith dmsmith at crosswire.org
Mon Jun 16 15:27:15 EDT 2025


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 <dmsmith at 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 <dmsmith at 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 at crosswire.org
>> http://crosswire.org/mailman/listinfo/sword-devel
>> Instructions to unsubscribe/change your settings at above page
> 
> _______________________________________________
> sword-devel mailing list: sword-devel at crosswire.org
> http://crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://crosswire.org/pipermail/sword-devel/attachments/20250616/8b79019b/attachment.htm>


More information about the sword-devel mailing list