go-pcre icon indicating copy to clipboard operation
go-pcre copied to clipboard

Protect re.extra damage from intensive CG working

Open ukolovda opened this issue 1 year ago • 2 comments

ukolovda avatar Aug 05 '24 18:08 ukolovda

I try this test:

func TestBulkMatcher(t *testing.T) {
	var res []Regexp
	for step := 0; step < 10000000; step++ {
		pattern := fmt.Sprintf("%s", `(?us) *Начислено за расчётный +(?:Объём +)?[CС]умма без\R`)
		newPattern, flags := ParseFlags(pattern)
		flags |= NEWLINE_ANY
		//log.Printf("Flags: %x", flags)

		re := MustCompile(newPattern, flags)
		studyFlags := 0 // STUDY_JIT_COMPILE
		err := re.Study(studyFlags)
		if err != nil {
			t.Fatalf("Study error: %s\n", err)
		}

		res = append(res, re)

		{
			subject := fmt.Sprintf("%s", "Начислено за расчётный                   Объём        Cумма без\r\n")
			m := res[0].NewMatcherString(subject, NO_UTF8_CHECK)
			if !m.Matches {
				t.Errorf("The match should be matched (run step: %d)", step)
				break
			}
		}

		{
			subject := fmt.Sprintf("%s", "Начислено за расчётный                   Объём        Cумма без\r\n")
			m := re.NewMatcherString(subject, NO_UTF8_CHECK)
			if !m.Matches {
				t.Errorf("The match should be matched (run step: %d)", step)
				break
			}
		}

		if step%10000 == 0 {
			t.Logf("Run step: %d", step)
		}
	}
}

It fails after random cycles.

ukolovda avatar Aug 05 '24 18:08 ukolovda

I checking it yet. May be Study returns nil when need return data.

ukolovda avatar Aug 05 '24 19:08 ukolovda