diff options
author | Daryl McDaniel <daryl.mcdaniel@intel.com> | 2014-08-06 18:29:02 +0000 |
---|---|---|
committer | darylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524> | 2014-08-06 18:29:02 +0000 |
commit | b04aba1773d313e50383b11acc599242c2723986 (patch) | |
tree | 2900d12feb8c11cc30d1c02f1552443f4460cbae /StdLib/LibC/gdtoa/gdtoa.h | |
parent | 09fd5328a48faf4f4dfda78015842317cd41c98c (diff) | |
download | edk2-platforms-b04aba1773d313e50383b11acc599242c2723986.tar.xz |
StdLib: The formatting for double float values, within the gdtoa library, is improper.
When running Enquire.efi, several errors similar to the following are produced:
Maximum exponent = 128
Maximum number = 3.40282347e+38
*** WARNING: Possibly bad output from printf above
expected value around 3.40282347e38, bit pattern:
11111111 11111111 01111111 01111111
sscanf gave -inf, bit pattern:
00000000 00000000 10000000 11111111
difference= inf
Overflow doesn’t seem to generate a trap
The memory allocation tests will also fail, sometimes leaving all available memory consumed.
The correct output in the above example is:
Maximum exponent = 128
Maximum number = 3.40282347e+38
Overflow doesn't seem to generate a trap
The root cause is that all operations on values of Long or ULong type, within the gdtoa library, must be 32-bit operations. A previous change replaced the Long and ULong definitions with INTN and UINTN, respectively. While this is correct for a lot of Linux and NetBSD code, it was not correct for this library.
This fix reverts the definitions of ULong and Long back to 32-bit types.
A descriptive comment has also been added to the U union.
Additional white-space has been added to tidy up the definitions of the word0 and word1 macros.
Verified with Enquire.efi and the ISO/IEC C Library compliance Validation Suite.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daryl McDaniel <daryl.mcdaniel@intel.com>
Reviewed-by: Jaben Carsey <Jaben.carsey@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15765 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'StdLib/LibC/gdtoa/gdtoa.h')
-rw-r--r-- | StdLib/LibC/gdtoa/gdtoa.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/StdLib/LibC/gdtoa/gdtoa.h b/StdLib/LibC/gdtoa/gdtoa.h index 82f126caf2..8617a57409 100644 --- a/StdLib/LibC/gdtoa/gdtoa.h +++ b/StdLib/LibC/gdtoa/gdtoa.h @@ -1,6 +1,13 @@ -/* $NetBSD: gdtoa.h,v 1.6.4.1.4.1 2008/04/08 21:10:55 jdc Exp $ */
+/** @file
-/****************************************************************
+ Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
+ This program and the accompanying materials are licensed and made available under
+ the terms and conditions of the BSD License that accompanies this distribution.
+ The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
The author of this software is David M. Gay.
@@ -26,6 +33,8 @@ IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
+ $NetBSD: gdtoa.h,v 1.6.4.1.4.1 2008/04/08 21:10:55 jdc Exp
+
****************************************************************/
/* Please send bug reports to David M. Gay (dmg at acm dot org,
@@ -38,10 +47,10 @@ THIS SOFTWARE. #include "arith.h"
#ifndef Long
-#define Long EFI_LONG_T
+#define Long int32_t
#endif
#ifndef ULong
-#define ULong EFI_ULONG_T
+#define ULong uint32_t
#endif
#ifndef UShort
#define UShort uint16_t
|