From: Marc G. Fournier Date: Fri, 6 Jun 1997 00:37:23 +0000 (+0000) Subject: From: "D'Arcy J.M. Cain" X-Git-Tag: REL6_1~41 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f50b103ce1b0aca3f63d47865dcf6f89ded158e5;p=postgresql From: "D'Arcy J.M. Cain" Subject: [HACKERS] backend/optimizer/geqo/geqo_erx.c I sent these changes in with a bunch of others. Some were folded in but others, like these, were not. I am not sure why so I am resending this to the developers list by itself for discussion. The readon why I suggest these changes is that the compiler can't tell that minimum_count is initialized before it is used. The tests that I add in here will cause an immediate error if it doesn't. As the comments below suggest, if it is 100% guaranteed that the variable will always be initialized then how this is so should be commented here. I don't know how much strain the actual test puts on the performance but if it isn't too much then maybe leave it in for absolute safety anyway. There are also a few returns just to stop warnings. --- diff --git a/src/backend/optimizer/geqo/geqo_erx.c b/src/backend/optimizer/geqo/geqo_erx.c index f6d601d64d..8c3c63d755 100644 --- a/src/backend/optimizer/geqo/geqo_erx.c +++ b/src/backend/optimizer/geqo/geqo_erx.c @@ -3,7 +3,7 @@ * geqo_erx.c-- * edge recombination crossover [ER] * -* $Id: geqo_erx.c,v 1.1 1997/02/19 12:56:55 scrappy Exp $ +* $Id: geqo_erx.c,v 1.2 1997/06/06 00:37:23 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -278,7 +278,7 @@ gimme_gene (Edge edge, Edge *edge_table) int i; Gene friend; int minimum_edges; - int minimum_count; + int minimum_count = -1; int rand_decision; /* no point has edges to more than 4 other points @@ -299,18 +299,27 @@ gimme_gene (Edge edge, Edge *edge_table) if (friend < 0) return ( (Gene) Abs(friend)); - /* give priority to candidates with fewest remaining unused edges; - find out what the minimum number of unused edges is (minimum_edges); - if there is more than one cadidate with the minimum number - of unused edges keep count of this number (minimum_count); */ - + /* give priority to candidates with fewest remaining unused edges; + find out what the minimum number of unused edges is (minimum_edges); + if there is more than one cadidate with the minimum number + of unused edges keep count of this number (minimum_count); */ + + /* The test for minimum_count can probably be removed at some + point but comments should probably indicate exactly why it + is guaranteed that the test will always succeed the first + time around. If it can fail then the code is in error */ + + if (edge_table[(int) friend].unused_edges < minimum_edges) { minimum_edges = edge_table[(int) friend].unused_edges; minimum_count = 1; } - else - if (edge_table[(int) friend].unused_edges == minimum_edges) - minimum_count++; + else + if (minimum_count == -1) + elog(WARN, "gimme_gene: Internal error - minimum_count not set"); + else + if (edge_table[(int) friend].unused_edges == minimum_edges) + minimum_count++; } /* for (i=0; i