Scott: 1. Could we enable this option in GCC to make it same to Microsoft?
2. Seemly, there is the warning C4344 problem in older Microsoft compilers. But, this warning can detect the real case. Now, there are few failure cases. How about fix them all? Thanks Liming -----Original Message----- From: Scott Duplichan [mailto:[email protected]] Sent: Wednesday, September 03, 2014 12:40 PM To: [email protected] Subject: [edk2] Warning C4244 causes build failure with older Microsoft compilers EDK2 builds with 'warning level 4' when using Microsoft tools. For the most part, that enables desirable warnings similar to those provided by gcc -Wall. There is one major difference though, Microsoft warning level 4 warns about the routine practice of assigning a larger size integer to a smaller size integer. The Microsoft warning looks like: warning C4244: conversion from 'UINT32' to 'UINT8', possible loss of data Gcc has a warning option that is similar to Microsoft C4244: -WConversion But the gcc option -Wall does _not_ enable -Wconversion. In fact, gcc option -Wextra doesn't even enable -Wconversion. That suggests that -Wconversion is a specialty warning not suitable for general use. EDK2 gcc builds do not enable -Wconversion. I think Microsoft warning C4244 (and similar) should be removed from EDK2 so that Microsoft warning settings are more consistent with gcc warning settings. But that might be a difficult change to push through. While it would be interesting to see what others think, completely removing Microsoft Warning C4244 is a discussion for another day. The immediate problem should be a lot easier to get agreement on. The problem is that warning C4244 is buggy/imperfect in older Microsoft compilers (DDK3790, VS2003, VS2005). As a result, some builds fail with those compilers, but pass with newer ones. Here are examples: OvmfPkg\Library\LoadLinuxLib\Linux.c(387) OvmfPkg\Library\LoadLinuxLib\Linux.c(388) OvmfPkg\VirtioBlkDxe\VirtioBlk.c(773) OvmfPkg\VirtioBlkDxe\VirtioBlk.c(774) OvmfPkg\VirtioNetDxe\DriverBinding.c(132) OvmfPkg\VirtioScsiDxe\VirtioScsi.c(751) StdLib\BsdSocketLib\res_mkupdate.c(186) Here are code snippets that demonstrate the warning C4344 problem with older Microsoft compilers: #if defined (__GNUC__) #include <stdint.h> #else #define uint16_t unsigned __int16 #define uint32_t unsigned __int32 #define uint64_t unsigned __int64 #endif char test1 (int x) {return !x;} char test2 (int x) {return x == 1;} char test3 (int x) {return x & 1;} uint32_t test4 (uint64_t x) {return x >> 32;} uint32_t test5 (uint64_t x) {return x && 0xFFFFFFFF;} enum {a=1, b=2}; uint16_t test6 (int x) {return x ? a : b;} /* W A R N I N G C O U N T S Tool chain test1 test2 test3 test4 test5 test6 DDK3790 /W4 1 1 1 1 0 1 VS2003 /W4 1 1 1 1 0 1 VS2005 /W4 1 1 1 1 0 0 VS2008 /W4 0 0 0 0 0 0 VS2010 /W4 0 0 0 0 0 0 VS2012 /W4 0 0 0 0 0 0 VS2013 /W4 0 0 0 0 0 0 With VS2008 and newer, Microsoft compilers eliminate several causes of unwanted warnings. If others agree, I can make a BaseTools\Conf\tools_def.template patch to disable warning C4244 for DDK3790, VS2003, and VS2005. Thanks, Scott ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
