Eric Blake <ebl...@redhat.com> writes: > We have two flavors of vararg usage in qtest; make it clear that > qmp() has different semantics than hmp(), and let the compiler > enforce that hmp() is used correctly. Since qmp() only accepts > a subset of printf flags (namely, those that our JSON parser > understands), I figured that it is probably not worth adding a > format attribute to qmp() at this time. > > Signed-off-by: Eric Blake <ebl...@redhat.com> > --- > tests/libqtest.h | 23 ++++++++++++++--------- > 1 file changed, 14 insertions(+), 9 deletions(-) > > diff --git a/tests/libqtest.h b/tests/libqtest.h > index 38bc1e9..762ed13 100644 > --- a/tests/libqtest.h > +++ b/tests/libqtest.h > @@ -50,7 +50,8 @@ void qtest_quit(QTestState *s); > /** > * qtest_qmp_discard_response: > * @s: #QTestState instance to operate on. > - * @fmt...: QMP message to send to qemu > + * @fmt...: QMP message to send to qemu; only recognizes formats > + * understood by json-lexer.c > * > * Sends a QMP message to QEMU and consumes the response. > */
These formats are chosen so that gcc can help us check them. Please add GCC_FMT_ATTR(). Precedence: qobject_from_jsonf(). Where are the "formats understood by json-lexer.c" documented? More of the same below. > @@ -59,7 +60,8 @@ void qtest_qmp_discard_response(QTestState *s, const char > *fmt, ...); > /** > * qtest_qmp: > * @s: #QTestState instance to operate on. > - * @fmt...: QMP message to send to qemu > + * @fmt...: QMP message to send to qemu; only recognizes formats > + * understood by json-lexer.c > * > * Sends a QMP message to QEMU and returns the response. > */ > @@ -134,14 +136,14 @@ QDict *qtest_qmp_eventwait_ref(QTestState *s, const > char *event); > /** > * qtest_hmp: > * @s: #QTestState instance to operate on. > - * @fmt...: HMP command to send to QEMU > + * @fmt...: HMP command to send to QEMU, passed through sprintf() Not actually through sprintf(), but I get what you mean. I like to document such things as "Format arguments like vsprintf()." > * > * Send HMP command to QEMU via QMP's human-monitor-command. > * QMP events are discarded. > * > * Returns: the command's output. The caller should g_free() it. > */ > -char *qtest_hmp(QTestState *s, const char *fmt, ...); > +char *qtest_hmp(QTestState *s, const char *fmt, ...) GCC_FMT_ATTR(2, 3); > > /** > * qtest_hmpv: > @@ -535,7 +537,8 @@ static inline void qtest_end(void) > > /** > * qmp: > - * @fmt...: QMP message to send to qemu > + * @fmt...: QMP message to send to qemu; only recognizes formats > + * understood by json-lexer.c > * > * Sends a QMP message to QEMU and returns the response. > */ > @@ -543,7 +546,8 @@ QDict *qmp(const char *fmt, ...); > > /** > * qmp_async: > - * @fmt...: QMP message to send to qemu > + * @fmt...: QMP message to send to qemu; only recognizes formats > + * understood by json-lexer.c > * > * Sends a QMP message to QEMU and leaves the response in the stream. > */ > @@ -551,7 +555,8 @@ void qmp_async(const char *fmt, ...); > > /** > * qmp_discard_response: > - * @fmt...: QMP message to send to qemu > + * @fmt...: QMP message to send to qemu; only recognizes formats > + * understood by json-lexer.c > * > * Sends a QMP message to QEMU and consumes the response. > */ > @@ -592,13 +597,13 @@ static inline QDict *qmp_eventwait_ref(const char > *event) > > /** > * hmp: > - * @fmt...: HMP command to send to QEMU > + * @fmt...: HMP command to send to QEMU, passed through printf() Here, you claim printf(). Typo? > * > * Send HMP command to QEMU via QMP's human-monitor-command. > * > * Returns: the command's output. The caller should g_free() it. > */ > -char *hmp(const char *fmt, ...); > +char *hmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2); > > /** > * get_irq: