On Tue, Feb 18, 2025 at 04:46:56PM +0000, Bruce Richardson wrote:
> On Tue, Feb 18, 2025 at 08:32:02AM -0800, Andre Muezerie wrote:
> > Compiling with MSVC results in warnings like the one below:
> > 
> > app/test-pmd/csumonly.c(1085): warning C4477: 'printf' : format string
> >     '%d' requires an argument of type 'int',
> >     but variadic argument 1 has type 'uint64_t'
> > 
> > Signed-off-by: Andre Muezerie <andre...@linux.microsoft.com>
> > Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
> > ---
> >  app/test-pmd/csumonly.c | 23 ++++++++++++-----------
> >  1 file changed, 12 insertions(+), 11 deletions(-)
> > 
> > diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
> > index d77a140641..8de5ad6ad9 100644
> > --- a/app/test-pmd/csumonly.c
> > +++ b/app/test-pmd/csumonly.c
> > @@ -1070,7 +1070,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
> >                             info.l2_len, rte_be_to_cpu_16(info.ethertype),
> >                             info.l3_len, info.l4_proto, info.l4_len, buf);
> >                     if (rx_ol_flags & RTE_MBUF_F_RX_LRO)
> > -                           printf("rx: m->lro_segsz=%u\n", m->tso_segsz);
> > +                           printf("rx: m->lro_segsz=%" PRIu64 "\n", 
> > (uint64_t)m->tso_segsz);
> 
> tso_segsz is already uint64_t, so no need for the cast.

The compilers differ in behavior here. tso_segsz only uses 16 bits of the 
uint64_t,
and gcc tries to be smart about it and implicitly converts tso_segsz into an int
(since it fits into an int). Msvc does not do that, and keeps the type for 
tso_segsz
as uint64_t. To support both compilers it seems there's no way to avoid the 
cast.

> 
> >                     if (info.is_tunnel == 1)
> >                             printf("rx: outer_l2_len=%d outer_ethertype=%x "
> >                                     "outer_l3_len=%d\n", info.outer_l2_len,
> > @@ -1082,28 +1082,29 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
> >                                         RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
> >                                         RTE_ETH_TX_OFFLOAD_SCTP_CKSUM)) ||
> >                             info.tso_segsz != 0)
> > -                           printf("tx: m->l2_len=%d m->l3_len=%d "
> > -                                   "m->l4_len=%d\n",
> > -                                   m->l2_len, m->l3_len, m->l4_len);
> > +                           printf("tx: m->l2_len=%" PRIu64 " m->l3_len=%" 
> > PRIu64
> > +                                   " m->l4_len=%" PRIu64 "\n",
> > +                                   (uint64_t)m->l2_len, 
> > (uint64_t)m->l3_len,
> > +                                   (uint64_t)m->l4_len);
> 
> Same here, using casts and a changed print format seems wrong in the patch.
> Either we change the format string to match the variable type, or we cast
> the variables to match the format string. We should not do both, IMHO.

I also normally prefer to not see unnecessary casts in the code, but it looks 
like
it is needed in this case, as explained above.

> 
> >                     if (info.is_tunnel == 1) {
> >                             if ((tx_offloads &
> >                                 RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
> >                                 (tx_offloads &
> >                                 RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM) ||
> >                                 (tx_ol_flags & RTE_MBUF_F_TX_OUTER_IPV6))
> > -                                   printf("tx: m->outer_l2_len=%d "
> > -                                           "m->outer_l3_len=%d\n",
> > -                                           m->outer_l2_len,
> > -                                           m->outer_l3_len);
> > +                                   printf("tx: m->outer_l2_len=%" PRIu64
> > +                                           " m->outer_l3_len=%" PRIu64 
> > "\n",
> > +                                           (uint64_t)m->outer_l2_len,
> > +                                           (uint64_t)m->outer_l3_len);
> >                             if (info.tunnel_tso_segsz != 0 &&
> >                                             (m->ol_flags & 
> > (RTE_MBUF_F_TX_TCP_SEG |
> >                                                     RTE_MBUF_F_TX_UDP_SEG)))
> > -                                   printf("tx: m->tso_segsz=%d\n",
> > -                                           m->tso_segsz);
> > +                                   printf("tx: m->tso_segsz=%" PRIu64 "\n",
> > +                                           (uint64_t)m->tso_segsz);
> >                     } else if (info.tso_segsz != 0 &&
> >                                     (m->ol_flags & (RTE_MBUF_F_TX_TCP_SEG |
> >                                             RTE_MBUF_F_TX_UDP_SEG)))
> > -                           printf("tx: m->tso_segsz=%d\n", m->tso_segsz);
> > +                           printf("tx: m->tso_segsz=%" PRIu64 "\n", 
> > (uint64_t)m->tso_segsz);
> >                     rte_get_tx_ol_flag_list(m->ol_flags, buf, sizeof(buf));
> >                     printf("tx: flags=%s", buf);
> >                     printf("\n");
> > -- 
> > 2.48.1.vfs.0.0
> > 

Reply via email to