[Bug 2012076] Re: printf function outputs different results for same arguments

Stan Liao 2012076 at bugs.launchpad.net
Mon Mar 20 15:19:01 UTC 2023


>From the viewpoint that "%f" directs printf to retrieve a 8-byte data
from stack, and the function call statement does push a 8-byte floating-
point number into stack (though the statement says that the data is a
pointer), then printf shall work correctly. Ya, there is no such issue
if the program is compiled by Microsoft VC compiler. So, the glibc
library does additional checks. Thanks a lot.

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to glibc in Ubuntu.
https://bugs.launchpad.net/bugs/2012076

Title:
  printf function outputs different results for same arguments

Status in glibc package in Ubuntu:
  Invalid

Bug description:
  A union is defined for storing different datatype values; and all
  values' data lengths are the same.

  Since the data lengths of the union members are the same, i suppose
  that printf function can have specified output format with specifying
  any union member.

  The scenario can be seen in the following sample code. Variable v is
  assigned with a floating number in the beginning; to output this
  value, the output format is specified as "%f" in the printf function
  format string, but the value is given by v.p, which is a void * type,
  as next argument. See the output results of the printf("v.p_f = %f\n",
  v.p); statement, there are 3 different result.

  //===========================
  #include <stdio.h>
  #include <stdlib.h>

  typedef union 
  {
      double f;
      long int i;
      void *p;
  } type_t;

  void func2(int a, int b, type_t v);

  int main(void)
  {
      type_t v;
      unsigned char *p;

  
      printf("sizeof(double)   = %ld\n", sizeof(double));
      printf("sizeof(long int) = %ld\n", sizeof(long int));
      printf("sizeof(void *)   = %ld\n", sizeof(void *));
      printf("sizeof(type_t)   = %ld\n", sizeof(type_t));

      v.f = 123.456789;

      printf("\nIn %s()\n", __FUNCTION__);
      printf("v.p_f = %f\n",  v.p);
      printf("v.i_x = %lX\n", v.i);

      printf("cont. = ");
      p = (unsigned char *) &v;
      for (int i = 7; i >= 0; --i)
          printf("%02X", p[i]);
      printf("\n");

      printf("v.p_p = %p\n",  v.p);
      printf("v.i_d = %ld\n", v.i);
      printf("v.f_f = %f\n",  v.f);
      printf("v.p_f = %f\n",  v.p);

      func2(1, 2, v);

      printf("\nIn %s()\n", __FUNCTION__);
      printf("v.i_d = %ld\n", v.i);
      printf("v.p_f = %f\n",  v.p);
      printf("v.f_f = %f\n",  v.f);
      printf("v.p_f = %f\n",  v.p);
      printf("\n");

  #ifdef __GNUC__
      printf("__GNUC__\n");
      printf("__VERSION__ = %s\n", __VERSION__);
  #endif

      fflush(stdout);

  #ifdef __linux__
      system("`find /usr/lib -executable -name *libc.so*` --version");
      printf("\n");
  #endif
      return (0);
  }

  void func2(int a, int b, type_t v)
  {
      unsigned char *p;

      printf("\nIn %s()\n", __FUNCTION__);
      printf("v.p_f = %f\n",  v.p);
      printf("v.i_x = %lX\n", v.i);

      printf("cont. = ");
      p = (unsigned char *) &v;
      for (int i = 7; i >= 0; --i)
          printf("%02X", p[i]);
      printf("\n");

      printf("v.p_p = %p\n",  v.p);
      printf("v.i_d = %ld\n", v.i);
      printf("v.f_f = %f\n",  v.f);
      printf("v.p_f = %f\n",  v.p);
  }

  
  //==================================
  sizeof(double)   = 8
  sizeof(long int) = 8
  sizeof(void *)   = 8
  sizeof(type_t)   = 8

  In main()
  v.p_f = 0.000000
  v.i_x = 405EDD3C07EE0B0B
  cont. = 405EDD3C07EE0B0B
  v.p_p = 0x405edd3c07ee0b0b
  v.i_d = 4638387916139006731
  v.f_f = 123.456789
  v.p_f = 123.456789

  In func2()
  v.p_f = 0.000000
  v.i_x = 405EDD3C07EE0B0B
  cont. = 405EDD3C07EE0B0B
  v.p_p = 0x405edd3c07ee0b0b
  v.i_d = 4638387916139006731
  v.f_f = 123.456789
  v.p_f = 123.456789

  In main()
  v.i_d = 4638387916139006731
  v.p_f = -5486124068793688683255936251187209270074392635932332070112001988456197381759672947165175699536362793613284725337872111744958183862744647903224103718245670299614498700710006264535590197791934024641512541262359795191593953928908168990292758500391456212260452596575509589842140073806143686060649302051520512.000000
  v.f_f = 123.456789
  v.p_f = 123.456789

  __GNUC__
  __VERSION__ = 9.4.0
  GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.9) stable release version 2.31.
  Copyright (C) 2020 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.
  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
  PARTICULAR PURPOSE.
  Compiled by GNU CC version 9.4.0.
  libc ABIs: UNIQUE IFUNC ABSOLUTE
  For bug reporting instructions, please see:
  <https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/2012076/+subscriptions




More information about the foundations-bugs mailing list