New Upstream Snapshot - lastz

Ready changes

Summary

Merged new upstream version: 1.04.22+git20221105.1.e66c1da (was: 1.04.22).

Resulting package

Built on 2022-11-18T11:53 (took 8m31s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots lastz-dbgsymapt install -t fresh-snapshots lastz-examplesapt install -t fresh-snapshots lastz

Lintian Result

Diff

diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index c7ddc1a..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,18 +0,0 @@
-# Compiled source #
-###################
-*.o
-src/lastz
-src/lastz_D
-src/lastz_32
-
-# Makefile variants #
-###################
-Makefile.*
-
-# Test results #
-###################
-test_results/base_test.*
-
-# OS generated files #
-######################
-.DS_Store
diff --git a/debian/changelog b/debian/changelog
index e33da10..d4c5866 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+lastz (1.04.22+git20221105.1.e66c1da-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 18 Nov 2022 11:46:47 -0000
+
 lastz (1.04.22-2) unstable; urgency=medium
 
   * Fix watch file
diff --git a/debian/patches/fix_signed_char.patch b/debian/patches/fix_signed_char.patch
index 83377c3..decdd5d 100644
--- a/debian/patches/fix_signed_char.patch
+++ b/debian/patches/fix_signed_char.patch
@@ -3,8 +3,10 @@ Description: Fix Build issue on a couple of architectures
 Author: Andreas Tille <tille@debian.org>
 Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
 
---- a/src/sequences.c
-+++ b/src/sequences.c
+Index: lastz.git/src/sequences.c
+===================================================================
+--- lastz.git.orig/src/sequences.c
++++ lastz.git/src/sequences.c
 @@ -5101,14 +5101,14 @@ static int find_next_general_fasta_coi
  		// find the next header
  
diff --git a/debian/patches/propagate_cflags.patch b/debian/patches/propagate_cflags.patch
index 00ed4d7..7e06504 100644
--- a/debian/patches/propagate_cflags.patch
+++ b/debian/patches/propagate_cflags.patch
@@ -6,9 +6,11 @@ Description: Propagate DEB_CFLAGS_MAINT_APPEND  = -Wno-stringop-truncation
 Reviewed-By: Étienne Mollier <emollier@debian.org>
 Last-Update: 2021-11-02
 
---- lastz.orig/src/Makefile
-+++ lastz/src/Makefile
-@@ -71,7 +71,7 @@
+Index: lastz.git/src/Makefile
+===================================================================
+--- lastz.git.orig/src/Makefile
++++ lastz.git/src/Makefile
+@@ -71,7 +71,7 @@ VERSION_FLAGS= \
  	-DSUBVERSION_REV="\"${SUBVERSION_REV}"\"
  
  
@@ -17,7 +19,7 @@ Last-Update: 2021-11-02
  
  
  srcFiles = lastz infer_scores \
-@@ -91,23 +91,23 @@
+@@ -91,23 +91,23 @@ incFiles = lastz.h infer_scores.h \
             utilities.h dna_utilities.h sequences.h capsule.h
  
  %.o: %.c version.mak ${incFiles}
diff --git a/debian/patches/spelling.patch b/debian/patches/spelling.patch
index bbd29c8..eb0098f 100644
--- a/debian/patches/spelling.patch
+++ b/debian/patches/spelling.patch
@@ -2,8 +2,10 @@ Description: Fix spelling
 Author: Andreas Tille <tille@debian.org>
 Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
 
---- a/src/dna_utilities.c
-+++ b/src/dna_utilities.c
+Index: lastz.git/src/dna_utilities.c
+===================================================================
+--- lastz.git.orig/src/dna_utilities.c
++++ lastz.git/src/dna_utilities.c
 @@ -1147,7 +1147,7 @@ exscoreset* read_score_set
  
  	if ((xss->ss.gapOpenSet) && (xss->ss.gapOpen + xss->ss.gapExtend <= 0))
@@ -13,9 +15,11 @@ Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
  		          name, xss->ss.gapOpen, xss->ss.gapExtend);
  	if ((xss->ss.gapExtendSet) && (xss->ss.gapExtend < 0))
  		suicidef (scoreFmt " is not a valid gap extension penalty (in %s)\n",
---- a/src/lastz.c
-+++ b/src/lastz.c
-@@ -4883,7 +4883,7 @@ static void format_options (void)
+Index: lastz.git/src/lastz.c
+===================================================================
+--- lastz.git.orig/src/lastz.c
++++ lastz.git/src/lastz.c
+@@ -4918,7 +4918,7 @@ static void format_options (void)
  	fprintf (helpout, "there may be a question as to whether or not lastz completed successfully.  The\n");
  	fprintf (helpout, "line \"# lastz end-of-file\" is written to output as the last line.  Note that\n");
  	fprintf (helpout, "in some formats this is *not* a legal line;  the user must remove it before any\n");
@@ -24,7 +28,7 @@ Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
  
  	exit (EXIT_FAILURE);
  	}
-@@ -8771,7 +8771,7 @@ static void parse_options
+@@ -8843,7 +8843,7 @@ static void parse_options
  
  		if ((haveGapOpen) && (gapOpen + gapExtend <= 0))
  			chastise ("%s is not a valid gap open penalty with extension penalty %s\n"
diff --git a/src/gapped_extend.c b/src/gapped_extend.c
index 84e6936..71843d5 100755
--- a/src/gapped_extend.c
+++ b/src/gapped_extend.c
@@ -32,6 +32,18 @@
 //
 //----------
 
+//----------
+//
+// ~~~ github issue 52 ~~~ 
+//
+// Some of the code here has potential overflow issues if tb->size > INT_MAX.
+// This is because it, and some derived variables, are incorrectly treated as
+// if they were ints. As this writing (Oct/2022) it is more prudent to limit
+// tb->size to INT_MAX (that limit is enforced in lastz.c) than to risk
+// breaking the core gapped alignment code here.
+//
+//----------
+
 //----------
 //
 // other files
@@ -2252,6 +2264,10 @@ static score score_identical_partition_of
 //
 //----------
 
+// ~~~ github issue 52 ~~~ 
+// The formula here to compute the number of cells is subject to integer
+// overflow if size>INT_MAX.
+
 tback* new_traceback
    (u32		size)
 	{
@@ -3306,6 +3322,7 @@ static void tbrow_needed (u32 rowsNeeded)
 
 	if (rowsNeeded <= tbRowLen) return;
 
+	// ~~~ github issue 52 ~~~ this should test for overflow
 	needed = round_up(sizeof(u32)*(rowsNeeded+1+rowsNeeded/16), 512*1024);
 	tbRow = realloc_or_die ("ydrop_one_sided_align tbRow", tbRow, needed);
 	tbRowLen = needed / sizeof(u32);
@@ -3320,6 +3337,9 @@ void free_traceback_rows (void)
 
 
 //=== ydrop_one_sided_align ===
+// ~~~ github issue 52 ~~~ 
+// tbLen should be u32, not int
+// tbNeeded should be u32, not int
 
 static score ydrop_one_sided_align
    (alignio*	io,
@@ -3574,6 +3594,7 @@ static score ydrop_one_sided_align
 
 		if (RY < LY) RY = LY;	// (see note 11)
 		tbNeeded = RY - LY + yDropTail;
+		// ~~~ github issue 52 ~~~ could this test fail due to overflow?
 		if ((tbp - tb->space) + tbNeeded >= tbLen)
 			{
 			if (gapped_extend_inhibitTruncationReport)
@@ -3778,6 +3799,7 @@ dp_finished:
 		cTemp = 0;		// (place to set a breakpoint)
 #endif // snoopAlgorithm
 
+	// ~~~ github issue 52 ~~~ need to check if this loop has overflow issues
 	for (prevOp=0 ; (row>=1) || (col>0) ; prevOp=op)
 		{
 		link = tb->space[tbRow[row] + col];
diff --git a/src/lastz.c b/src/lastz.c
index 82d5011..4ae8595 100755
--- a/src/lastz.c
+++ b/src/lastz.c
@@ -126,6 +126,7 @@ char* programRevisionDate    = REVISION_DATE;
 #include <string.h>				// standard C string stuff
 #include <ctype.h>				// standard C upper/lower stuff
 #include <stdarg.h>				// standard C variable argument list stuff
+#include <limits.h>				// standard C value limit stuff
 #include <math.h>				// standard C math stuff
 #include <time.h>				// standard C time stuff
 #include "build_options.h"		// build options
@@ -447,6 +448,8 @@ static const int   defaultTwinsYes   = false;
 static const int   defaultTwinMinGap = 0;
 static const int   defaultTwinMaxGap = 10;
 
+static int   forceReportFilteredHsps     = false;
+
 static int   dbgShowMatrix               = false;
 static int   dbgDumpTargetSequence       = false;
 static int   dbgDumpQuerySequence        = false;
@@ -470,6 +473,7 @@ static char* dbgQueryProgressPrefix      = "";
 static int   dbgTargetProgress           = 0;
 static char* dbgTargetProgressPrefix     = "";
 #endif // allowSeveralTargets
+static int   dbgFilterProgress           = 0;
 static int   dbgReportFinish             = false;
 
 #define innerWordSize	7				// word size for inner alignment seed
@@ -585,7 +589,7 @@ static void      remove_interval_seeds   (unspos b, unspos e, void* info);
 static u32       report_hsps             (void* info,
                                           unspos pos1, unspos pos2, unspos length,
                                           score s);
-static u32       collect_filtered_hsps   (void* info,
+static u32       report_filtered_hsps    (void* info,
                                           unspos pos1, unspos pos2, unspos length,
                                           score s);
 static u32       collect_hsps            (void* info,
@@ -2806,9 +2810,14 @@ void set_up_hit_processor
 	  && (dbgShowHspCountsMin == (u32)-1)))
 		hpInfo->reporter = report_hsps;
 
-	if ((params->hspImmediate) && (!params->gappedExtend))
+	if (forceReportFilteredHsps)
 		{
-		hpInfo->reporter                  = collect_filtered_hsps;
+		hpInfo->reporter                  = report_filtered_hsps;
+		hpInfo->reporterInfo              = NULL;
+		}
+	else if ((params->hspImmediate) && (!params->gappedExtend))
+		{
+		hpInfo->reporter                  = report_filtered_hsps;
 		hpInfo->reporterInfo              = NULL;
 		}
 	else if ((params->hspImmediate) && (params->gappedExtend))
@@ -2910,25 +2919,25 @@ void set_up_hit_processor
 		}
 
 #ifdef snoopHitProc
-	if      (*_hitProc == process_for_plain_hit)        fprintf (stderr, "hitProc              == process_for_plain_hit (%p)\n",       *_hitProc);
-	else if (*_hitProc == process_for_recoverable_hit)  fprintf (stderr, "hitProc              == process_for_recoverable_hit (%p)\n", *_hitProc);
-	else if (*_hitProc == process_for_simple_hit)       fprintf (stderr, "hitProc              == process_for_simple_hit (%p)\n",      *_hitProc);
-	else if (*_hitProc == process_for_twin_hit)         fprintf (stderr, "hitProc              == process_for_twin_hit (%p)\n",        *_hitProc);
-	else                                                fprintf (stderr, "hitProc              == ??? (%p)\n",                         *_hitProc);
-
-	if      (*_hitProcInfo == &simpleInfo)              fprintf (stderr, "hitProcInfo          == simpleInfo (%p)\n",                  *_hitProcInfo);
-	else if (*_hitProcInfo == &twinInfo)                fprintf (stderr, "hitProcInfo          == twinInfo (%p)\n",                    *_hitProcInfo);
-	else                                                fprintf (stderr, "hitProcInfo          == ??? (%p)\n",                         *_hitProcInfo);
-
-	if      (hpInfo->reporter == collect_hsps)          fprintf (stderr, "hpInfo->reporter     == collect_hsps (%p)\n",                hpInfo->reporter);
-	else if (hpInfo->reporter == report_hsps)           fprintf (stderr, "hpInfo->reporter     == report_hsps (%p)\n",                 hpInfo->reporter);
-	else if (hpInfo->reporter == collect_filtered_hsps) fprintf (stderr, "hpInfo->reporter     == collect_filtered_hsps (%p)\n",       hpInfo->reporter);
-	else if (hpInfo->reporter == gappily_extend_hsps)   fprintf (stderr, "hpInfo->reporter     == gappily_extend_hsps (%p)\n",         hpInfo->reporter);
-	else                                                fprintf (stderr, "hpInfo->reporter     == ??? (%p)\n",                         hpInfo->reporter);
-
-	if      (hpInfo->reporterInfo == &gappilyInfo)      fprintf (stderr, "hpInfo->reporterInfo == gappily_extend_hsps (%p)\n",         hpInfo->reporterInfo);
-	else if (hpInfo->reporterInfo == NULL)              fprintf (stderr, "hpInfo->reporterInfo == NULL (%p)\n",                        hpInfo->reporterInfo);
-	else                                                fprintf (stderr, "hpInfo->reporterInfo == ??? (%p)\n",                         hpInfo->reporterInfo);
+	if      (*_hitProc == process_for_plain_hit)       fprintf (stderr, "hitProc              == process_for_plain_hit (%p)\n",       *_hitProc);
+	else if (*_hitProc == process_for_recoverable_hit) fprintf (stderr, "hitProc              == process_for_recoverable_hit (%p)\n", *_hitProc);
+	else if (*_hitProc == process_for_simple_hit)      fprintf (stderr, "hitProc              == process_for_simple_hit (%p)\n",      *_hitProc);
+	else if (*_hitProc == process_for_twin_hit)        fprintf (stderr, "hitProc              == process_for_twin_hit (%p)\n",        *_hitProc);
+	else                                               fprintf (stderr, "hitProc              == ??? (%p)\n",                         *_hitProc);
+
+	if      (*_hitProcInfo == &simpleInfo)             fprintf (stderr, "hitProcInfo          == simpleInfo (%p)\n",                  *_hitProcInfo);
+	else if (*_hitProcInfo == &twinInfo)               fprintf (stderr, "hitProcInfo          == twinInfo (%p)\n",                    *_hitProcInfo);
+	else                                               fprintf (stderr, "hitProcInfo          == ??? (%p)\n",                         *_hitProcInfo);
+
+	if      (hpInfo->reporter == collect_hsps)         fprintf (stderr, "hpInfo->reporter     == collect_hsps (%p)\n",                hpInfo->reporter);
+	else if (hpInfo->reporter == report_hsps)          fprintf (stderr, "hpInfo->reporter     == report_hsps (%p)\n",                 hpInfo->reporter);
+	else if (hpInfo->reporter == report_filtered_hsps) fprintf (stderr, "hpInfo->reporter     == report_filtered_hsps (%p)\n",       hpInfo->reporter);
+	else if (hpInfo->reporter == gappily_extend_hsps)  fprintf (stderr, "hpInfo->reporter     == gappily_extend_hsps (%p)\n",         hpInfo->reporter);
+	else                                               fprintf (stderr, "hpInfo->reporter     == ??? (%p)\n",                         hpInfo->reporter);
+
+	if      (hpInfo->reporterInfo == &gappilyInfo)     fprintf (stderr, "hpInfo->reporterInfo == gappily_extend_hsps (%p)\n",         hpInfo->reporterInfo);
+	else if (hpInfo->reporterInfo == NULL)             fprintf (stderr, "hpInfo->reporterInfo == NULL (%p)\n",                        hpInfo->reporterInfo);
+	else                                               fprintf (stderr, "hpInfo->reporterInfo == ??? (%p)\n",                         hpInfo->reporterInfo);
 #endif // snoopHitProc
 	}
 
@@ -3798,6 +3807,98 @@ static u32 report_hsps
 	return length;
 	}
 
+//----------
+// [[-- a seed hit reporter function --]]
+//
+// report_filtered_hsps--
+//	Report a seed hit or HSP (i.e. just write it to output), so long as it
+//	satisfies the current filtering criteria.
+//
+// Arguments and Return value: (see seed_search.h)
+//
+//----------
+//
+// Note: in earlier versions, this was collect_filtered_hsps(), but that was a
+//       misnomer.
+//
+//----------
+
+static u32 report_filtered_hsps
+   (arg_dont_complain(void* info),
+	unspos	pos1,
+	unspos	pos2,
+	unspos	length,
+	score	s)
+	{
+	static u64 numHsps = 0;
+	static u64 numRejected = 0;
+	unspos	startPos1 = pos1 - length;
+	unspos	startPos2 = pos2 - length;
+	segment	seg;
+
+	numHsps++;
+
+	if ((dbgFilterProgress != 0) && (numHsps % dbgFilterProgress == 1))
+		{
+		char* name2 = NULL;
+
+		if (currParams->seq2->partition.p == NULL) // sequence 2 is not partitioned
+			name2 = (currParams->seq1->useFullNames)? currParams->seq2->header
+													: currParams->seq2->shortHeader;
+		if ((name2 == NULL) || (name2[0] == 0)) name2 = "seq2";
+
+		fprintf (stderr, "filter: passed %s HSPs / rejected %s (%.2f%%) / %s.%s.pos=%s (%.2f%%)\n",
+		                 ucommatize(numHsps-numRejected), ucommatize(numRejected),
+		                 (100.0*numRejected) / numHsps,
+		                 name2,currParams->seq2->revCompFlags==rcf_forward?"fwd":"rev",ucommatize(pos2),
+		                 (100.0*pos2 / currParams->seq2->len));
+		}
+
+	// filter HSP by identity and/or coverage
+
+	if ((currParams->minIdentity > 0) || (currParams->maxIdentity < 1))
+		{
+		if (filter_segment_by_identity (currParams->seq1, startPos1,
+		                                currParams->seq2, startPos2, length,
+		                                currParams->minIdentity,
+		                                currParams->maxIdentity))
+			goto rejected;
+		}
+
+	if ((currParams->minCoverage > 0) || (currParams->maxCoverage < 1))
+		{
+		seg.pos1   = startPos1;
+		seg.pos2   = startPos2;
+		seg.length = length;
+		if (filter_segment_by_coverage (currParams->seq1, currParams->seq2, &seg,
+		                                currParams->minCoverage,
+		                                currParams->maxCoverage))
+			goto rejected;
+		}
+
+	if (currParams->minMatchCount > 0)
+		{
+		if (filter_segment_by_match_count (currParams->seq1, startPos1,
+		                                   currParams->seq2, startPos2, length,
+		                                   currParams->minMatchCount))
+			goto rejected;
+		}
+
+	if (currParams->maxMismatchCount >= 0)
+		{
+		if (filter_segment_by_mismatch_count (currParams->seq1, startPos1,
+		                                      currParams->seq2, startPos2, length,
+		                                      currParams->minMatchCount))
+			goto rejected;
+		}
+
+	return report_hsps (info, pos1, pos2, length, s);
+
+rejected:
+	numRejected++;
+	return 0;
+	}
+
 //----------
 // [[-- a seed hit reporter function --]]
 //
@@ -3889,72 +3990,6 @@ static u32 collect_hsps
 	return 2*length;
 	}
 
-//----------
-// [[-- a seed hit reporter function --]]
-//
-// collect_filtered_hsps--
-//	Collect a seed hit or HSP, so long as it satisfies the current filtering
-//	criteria.
-//
-// Arguments and Return value: (see seed_search.h)
-//
-//----------
-
-static u32 collect_filtered_hsps
-   (arg_dont_complain(void* info),
-	unspos	pos1,
-	unspos	pos2,
-	unspos	length,
-	score	s)
-	{
-	unspos	startPos1 = pos1 - length;
-	unspos	startPos2 = pos2 - length;
-	segment	seg;
-
-	// filter HSP by identity and/or coverage
-
-	if ((currParams->minIdentity > 0) || (currParams->maxIdentity < 1))
-		{
-		if (filter_segment_by_identity (currParams->seq1, startPos1,
-		                                currParams->seq2, startPos2, length,
-		                                currParams->minIdentity,
-		                                currParams->maxIdentity))
-			goto filtered;
-		}
-
-	if ((currParams->minCoverage > 0) || (currParams->maxCoverage < 1))
-		{
-		seg.pos1   = startPos1;
-		seg.pos2   = startPos2;
-		seg.length = length;
-		if (filter_segment_by_coverage (currParams->seq1, currParams->seq2, &seg,
-		                                currParams->minCoverage,
-		                                currParams->maxCoverage))
-			goto filtered;
-		}
-
-	if (currParams->minMatchCount > 0)
-		{
-		if (filter_segment_by_match_count (currParams->seq1, startPos1,
-		                                   currParams->seq2, startPos2, length,
-		                                   currParams->minMatchCount))
-			goto filtered;
-		}
-
-	if (currParams->maxMismatchCount >= 0)
-		{
-		if (filter_segment_by_mismatch_count (currParams->seq1, startPos1,
-		                                      currParams->seq2, startPos2, length,
-		                                      currParams->minMatchCount))
-			goto filtered;
-		}
-
-	return report_hsps (info, pos1, pos2, length, s);
-
-filtered:
-	return 0;
-	}
-
 //----------
 //
 // mirror_alignments--
@@ -6293,6 +6328,14 @@ static void parse_options_loop
 			}
 
 		// --allocate:traceback=<bytes> or --traceback=<bytes> or m=<bytes>
+		//
+		// ~~~ github issue 52 ~~~ 
+		// though tracebackMem is a u32, this must *not* exceed the maximum
+		// signed int; this is because some code in gapped_extend.c incorrectly
+		// treats tracebackMem, and derived variables, as if they were ints; as
+		// of this writing (Oct/2022) it is more prudent to limit tracebackMem
+		// to INT_MAX than to risk breaking the core code in gapped_extend.c;
+		// see notes in gapped_extend.c marked "github issue 52"
 
 		if ((strcmp_prefix (arg, "--allocate:traceback=") == 0)
 		 || (strcmp_prefix (arg, "--alloc:traceback="   ) == 0)
@@ -6301,7 +6344,15 @@ static void parse_options_loop
 		 || (strcmp_prefix (arg, "--traceback="         ) == 0)
 		 || (strcmp_prefix (arg, "m="                   ) == 0))
 			{
-			lzParams->tracebackMem = string_to_unitized_int (argStr, false /*units of 1,024*/);
+			int64 tracebackMemArg;
+			tracebackMemArg = string_to_unitized_int64 (argStr, false /*units of 1,024*/);
+			if (tracebackMemArg < 0)
+				chastise ("--allocate:traceback cannot be negative (%s)\n",arg);
+			if (tracebackMemArg == ((u32) INT_MAX)+1)
+				tracebackMemArg = INT_MAX; // special case so that "2G" is accepted
+			else if (tracebackMemArg > INT_MAX)
+				chastise ("--allocate:traceback cannot be more than 2G (%s)\n",arg);
+			lzParams->tracebackMem = (u32) tracebackMemArg;
 			goto next_arg;
 			}
 
@@ -7664,10 +7715,17 @@ static void parse_options_loop
 		 || (strcmp (arg, "--help=yasra") == 0))
 			{ expander_options ("yasra-specific options", "--yasra"); }
 
-		// --tryout=<what> (unadvertised)
+		// --force:<what> (unadvertised)
+
+		if ((strcmp (arg, "--force:reportfilteredhsps") == 0)
+		 || (strcmp (arg, "--force=reportfilteredhsps") == 0))
+			{ forceReportFilteredHsps = true;  goto next_arg; }
+
+		// --tryout:<what> (unadvertised)
 
 #ifdef tryout
-		if (strcmp (arg, "--tryout=immediategapped") == 0)
+		if ((strcmp (arg, "--tryout:immediategapped") == 0)
+		 || (strcmp (arg, "--tryout=immediategapped") == 0))
 			{
 			lzParams->hspImmediate = true;
 			goto next_arg;
@@ -7931,6 +7989,12 @@ static void parse_options_loop
 			{ dbgQueryProgressPrefix = dbgTargetProgressPrefix = "==================== ";  goto next_arg; }
 #endif // allowSeveralTargets
 
+		if (strcmp_prefix (arg, "--progress:filter=") == 0)
+			{
+			dbgFilterProgress = string_to_unitized_int (argStr, true /*units of 1,000*/);
+			goto next_arg;
+			}
+
 		if ((strcmp (arg, "--debug=converge") == 0)
 		 || (strcmp (arg, "--debug=convergence") == 0))
 			{ infer_scores_watchConverge = true;  goto next_arg; }
@@ -8562,6 +8626,14 @@ static void parse_options
 		lzParams->gappedExtend = false;
 		}
 
+	if (forceReportFilteredHsps)
+		{
+		if (lzParams->gappedExtend)
+			chastise ("-force:reportfilteredhsps can only be used with --nogapped\n");
+		if (lzParams->hspThreshold.t != 'S')   // (hsps are adaptive)
+			chastise ("-force:reportfilteredhsps cannot be used with an adaptive HSP threshold\n");
+		}
+
 	//////////
 	// set up score set
 	//////////
diff --git a/src/lastz.h b/src/lastz.h
index e3b730e..ac5c1f1 100755
--- a/src/lastz.h
+++ b/src/lastz.h
@@ -240,6 +240,10 @@ typedef struct control
 								//              .. alignment
 	u32			tracebackMem;	//     number of bytes to allocate to track
 								//     .. gapped alignment traceback
+								//     ~~~ github issue 52 ~~~ 
+								//     though declared as a u32, tracebackMem
+								//     .. must *not* exceed the maximum signed
+								//     .. int
 	tback*		traceback;		//     memory in which to track gapped alignment
 								//     .. traceback
 	int			nIsAmbiguous;	//     true  => N is an ambiguous nucleotide
diff --git a/src/utilities.c b/src/utilities.c
index 6670552..5c534de 100755
--- a/src/utilities.c
+++ b/src/utilities.c
@@ -728,6 +728,7 @@ int string_to_unitized_int
 
 	if (isFloat)
 		{
+		// nota bene: this test is not correct when vf=2.0 and mult=2^30
 		if ((vf > 0) && ( vf*mult > INT_MAX)) goto overflow;
 		if ((vf < 0) && (-vf*mult > INT_MAX)) goto overflow;
 		v = (vf * mult) + .5;
diff --git a/src/version.mak b/src/version.mak
index fa5bdea..a453249 100644
--- a/src/version.mak
+++ b/src/version.mak
@@ -1,4 +1,4 @@
 VERSION_MAJOR=1
 VERSION_MINOR=04
-VERSION_SUBMINOR=22
-REVISION_DATE=20220807
+VERSION_SUBMINOR=29
+REVISION_DATE=20221105

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/lib/debug/.build-id/47/6960fe25c0e8c4a34e854191b01955c3c48499.debug
-rw-r--r--  root/root   /usr/lib/debug/.build-id/5c/ce8ba282556ea19930c6e05cf7576963b67494.debug

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/lib/debug/.build-id/98/0e632202a72e2e6c34dc3eac376256770a95da.debug
-rw-r--r--  root/root   /usr/lib/debug/.build-id/ca/3663c95ac4fe43396f1b0bd353db510a1d9186.debug

No differences were encountered between the control files of package lastz

Control files of package lastz-dbgsym: lines which differ (wdiff format)

  • Build-Ids: 980e632202a72e2e6c34dc3eac376256770a95da ca3663c95ac4fe43396f1b0bd353db510a1d9186 476960fe25c0e8c4a34e854191b01955c3c48499 5cce8ba282556ea19930c6e05cf7576963b67494

No differences were encountered between the control files of package lastz-examples

More details

Full run details