mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Fix mismatch between printf format strings and arguments in some
solosolver verbose diagnostics in X mode. Also added gcc-specific prototypes with __attribute__((format)) to ensure they all get checked in future. Spotted by Arun Giridhar; segfault without this fix is reproducible by 'solosolver -v 3x3x:7_9e4_1c7d3e3d1b2_4e2c6e5_6b1d8e5d9c8_2e9_5'. [originally from svn r9151]
This commit is contained in:
26
solo.c
26
solo.c
@ -830,6 +830,24 @@ static void solver_place(struct solver_usage *usage, int x, int y, int n)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined STANDALONE_SOLVER && defined __GNUC__
|
||||||
|
/*
|
||||||
|
* Forward-declare the functions taking printf-like format arguments
|
||||||
|
* with __attribute__((format)) so as to ensure the argument syntax
|
||||||
|
* gets debugged.
|
||||||
|
*/
|
||||||
|
struct solver_scratch;
|
||||||
|
static int solver_elim(struct solver_usage *usage, int *indices,
|
||||||
|
char *fmt, ...) __attribute__((format(printf,3,4)));
|
||||||
|
static int solver_intersect(struct solver_usage *usage,
|
||||||
|
int *indices1, int *indices2, char *fmt, ...)
|
||||||
|
__attribute__((format(printf,4,5)));
|
||||||
|
static int solver_set(struct solver_usage *usage,
|
||||||
|
struct solver_scratch *scratch,
|
||||||
|
int *indices, char *fmt, ...)
|
||||||
|
__attribute__((format(printf,4,5)));
|
||||||
|
#endif
|
||||||
|
|
||||||
static int solver_elim(struct solver_usage *usage, int *indices
|
static int solver_elim(struct solver_usage *usage, int *indices
|
||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
, char *fmt, ...
|
, char *fmt, ...
|
||||||
@ -2239,7 +2257,7 @@ static void solver(int cr, struct block_structure *blocks,
|
|||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
, "intersectional analysis,"
|
, "intersectional analysis,"
|
||||||
" %d in \\-diagonal vs block %s",
|
" %d in \\-diagonal vs block %s",
|
||||||
n, 1+x, usage->blocks->blocknames[b]
|
n, usage->blocks->blocknames[b]
|
||||||
#endif
|
#endif
|
||||||
) ||
|
) ||
|
||||||
solver_intersect(usage, scratch->indexlist2,
|
solver_intersect(usage, scratch->indexlist2,
|
||||||
@ -2247,7 +2265,7 @@ static void solver(int cr, struct block_structure *blocks,
|
|||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
, "intersectional analysis,"
|
, "intersectional analysis,"
|
||||||
" %d in block %s vs \\-diagonal",
|
" %d in block %s vs \\-diagonal",
|
||||||
n, usage->blocks->blocknames[b], 1+x
|
n, usage->blocks->blocknames[b]
|
||||||
#endif
|
#endif
|
||||||
)) {
|
)) {
|
||||||
diff = max(diff, DIFF_INTERSECT);
|
diff = max(diff, DIFF_INTERSECT);
|
||||||
@ -2272,7 +2290,7 @@ static void solver(int cr, struct block_structure *blocks,
|
|||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
, "intersectional analysis,"
|
, "intersectional analysis,"
|
||||||
" %d in /-diagonal vs block %s",
|
" %d in /-diagonal vs block %s",
|
||||||
n, 1+x, usage->blocks->blocknames[b]
|
n, usage->blocks->blocknames[b]
|
||||||
#endif
|
#endif
|
||||||
) ||
|
) ||
|
||||||
solver_intersect(usage, scratch->indexlist2,
|
solver_intersect(usage, scratch->indexlist2,
|
||||||
@ -2280,7 +2298,7 @@ static void solver(int cr, struct block_structure *blocks,
|
|||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
, "intersectional analysis,"
|
, "intersectional analysis,"
|
||||||
" %d in block %s vs /-diagonal",
|
" %d in block %s vs /-diagonal",
|
||||||
n, usage->blocks->blocknames[b], 1+x
|
n, usage->blocks->blocknames[b]
|
||||||
#endif
|
#endif
|
||||||
)) {
|
)) {
|
||||||
diff = max(diff, DIFF_INTERSECT);
|
diff = max(diff, DIFF_INTERSECT);
|
||||||
|
Reference in New Issue
Block a user