mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -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
|
||||
#ifdef STANDALONE_SOLVER
|
||||
, char *fmt, ...
|
||||
@ -2239,7 +2257,7 @@ static void solver(int cr, struct block_structure *blocks,
|
||||
#ifdef STANDALONE_SOLVER
|
||||
, "intersectional analysis,"
|
||||
" %d in \\-diagonal vs block %s",
|
||||
n, 1+x, usage->blocks->blocknames[b]
|
||||
n, usage->blocks->blocknames[b]
|
||||
#endif
|
||||
) ||
|
||||
solver_intersect(usage, scratch->indexlist2,
|
||||
@ -2247,7 +2265,7 @@ static void solver(int cr, struct block_structure *blocks,
|
||||
#ifdef STANDALONE_SOLVER
|
||||
, "intersectional analysis,"
|
||||
" %d in block %s vs \\-diagonal",
|
||||
n, usage->blocks->blocknames[b], 1+x
|
||||
n, usage->blocks->blocknames[b]
|
||||
#endif
|
||||
)) {
|
||||
diff = max(diff, DIFF_INTERSECT);
|
||||
@ -2272,7 +2290,7 @@ static void solver(int cr, struct block_structure *blocks,
|
||||
#ifdef STANDALONE_SOLVER
|
||||
, "intersectional analysis,"
|
||||
" %d in /-diagonal vs block %s",
|
||||
n, 1+x, usage->blocks->blocknames[b]
|
||||
n, usage->blocks->blocknames[b]
|
||||
#endif
|
||||
) ||
|
||||
solver_intersect(usage, scratch->indexlist2,
|
||||
@ -2280,7 +2298,7 @@ static void solver(int cr, struct block_structure *blocks,
|
||||
#ifdef STANDALONE_SOLVER
|
||||
, "intersectional analysis,"
|
||||
" %d in block %s vs /-diagonal",
|
||||
n, usage->blocks->blocknames[b], 1+x
|
||||
n, usage->blocks->blocknames[b]
|
||||
#endif
|
||||
)) {
|
||||
diff = max(diff, DIFF_INTERSECT);
|
||||
|
Reference in New Issue
Block a user