use*_*812 -1 c c++ 64-bit visual-studio-2010
使用VS 2003生成的用于生成32位二进制文件的代码在没有单个警告的情况下构建.
相同的代码,没有单一的代码更改,编译和链接成功使用Visual Studio 2010编译器生成64位二进制BUT与下面的警告列表.
所以,我的问题是,下面列表中的任何警告都是运行时的问题吗?
pcd.c(248) : warning C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
pcd.c(377) : warning C4244: '=' : conversion from 'uintptr_t' to 'ULONG', possible loss of data
pcd.c(236) : warning C4100: 'argv' : unreferenced formal parameter
i.c(183) : warning C4100: 'lpReserved' : unreferenced formal parameter
api.c(506) : warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _stricmp. See online help for details.
api.c(554) : warning C4310: cast truncates constant value
api.c(719) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
api.c(2217) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
api.c(2892) : warning C4312: 'type cast' : conversion from 'ULONG_T' to 'HANDLE_T' of greater size
api.c(559) : warning C4702: unreachable code
stdio.h(234) : see declaration of 'fopen'
api.c(2217) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
prm.c(681) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\stdio.h(234) : see declaration of 'fopen'
host.c(410) : warning C4311: 'type cast' : pointer truncation from 'PVOID_T' to 'unsigned long'
stub.c(138) : warning C4295: 'eye' : array is too small to include a terminating null character
isv.c(372) : warning C4310: cast truncates constant value
chp.c(250) : warning C4244: '=' : conversion from 'SOCKET' to 'ULONG_T', possible loss of data
api.c(665) : warning C4311: 'type cast' : pointer truncation from 'HANDLE_T' to 'LONG'
api.c(1216) : warning C4057: 'function' : 'LPDWORD' differs in indirection to slightly different base types from 'LONG_T *'
hlp.c(1171) : warning C4057: 'function' : 'LPDWORD' differs in indirection to slightly different base types from 'LONG_T *'
neto.c(435) : warning C4057: 'function' : 'PLONG_T' differs in indirection to slightly different base types from 'ULONG_T *'
neto.c(595) : warning C4152: nonstandard extension, function/data pointer conversion in expression
neto.c(2115) : warning C4213: nonstandard extension used : cast on l-value
neto.c(2209) : warning C4057: 'function' : 'int *' differs in indirection to slightly different base types from 'LONG *'
td.c(760) : warning C4244: '=' : conversion from 'uintptr_t' to 'int', possible loss of data
td.c(2104) : warning C4054: 'type cast' : from function pointer 'FARPROC' to data pointer 'PVOID'
msc.c(287) : warning C4133: 'function' : incompatible types - from 'long *' to 'time_t *'
msc.c(1009) : warning C4702: unreachable code
inf.c(400) : warning C4057: 'function' : 'PLONG_T' differs in indirection to slightly different base types from 'ULONG *'
arb.c(166) : warning C4267: '=' : conversion from 'size_t' to 'LONG_T', possible loss of data
arb.c(226) : warning C4244: '=' : conversion from 'int' to 'CHAR_T', possible loss of data
sl.c(441) : warning C4054: 'type cast' : from function pointer 'int (__cdecl *)(unsigned char *,int,int,void *)' to data pointer 'void *'
pco.c(369) : warning C4057: 'function' : 'PLONG_T' differs in indirection to slightly different base types from 'ULONG_T *'
exit1.c(157) : warning C4295: 'publickey' : array is too small to include a terminating null
env.c(341) : warning C4267: 'function' : conversion from 'size_t' to 'DWORD', possible loss of data
hook.c(221) : warning C4245: 'return' : conversion from 'int' to 'SOCKET', signed/unsigned mismatch
hook.c(817) : warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'int'
tor.c(128) : warning C4244: 'function' : conversion from 'time_t' to 'unsigned int', possible loss of data
cth.c(1012) : warning C4244: '=' : conversion from '__int64' to 'int', possible loss of data
cntrl.c(427) : warning C4996: 'strnicmp': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strnicmp. See online help for details.
api.c(263) : warning C4057: 'function' : 'int *' differs in indirection to slightly different base types from 'LONG_T *'
api.c(706) : warning C4057: 'function' : 'int *' differs in indirection to slightly different base types from 'DWORD *'
ii.c(252) : warning C4244: '=' : conversion from 'time_t' to 'long', possible loss of data
Run Code Online (Sandbox Code Playgroud)
谢谢
我建议你只需更好地阅读错误信息.它们用简单的语言编写.Google可以提供您尚不了解的条款.
让我们来看看,我们呢?
pcd.c(248):警告C4996:'getenv':此函数或变量可能不安全.请考虑使用_dupenv_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.
只有在getenv从另一个线程更改变量时调用,我才会担心这个问题.这些例程的问题在于它们依赖于全局状态,这在使用多个线程时会出现问题.较新的版本也更清楚谁拥有什么分配.
pcd.c(377):警告C4244:'=':从'uintptr_t'转换为'ULONG',可能会丢失数据
看起来很可疑.你是否正在使用指向整数的指针做一些时髦的事情?在64位Windows引入的时候,他们ULONG_PTR为此添加了.
pcd.c(236):警告C4100:'argv':未引用的形式参数
ic(183):警告C4100:'lpReserved':未引用的形式参数
可以安全地被忽视或压制.
api.c(506):警告C4996:'stricmp':不推荐使用此项目的POSIX名称.而是使用符合ISO C++的名称:_stricmp.详细信息请参见在线帮助.
不是非常关心.带有下划线的名称最终可能会降低使用*nix系统的可移植性.
api.c(554):警告C4310:cast截断常量值
看起来很可疑.请提供示例.
api.c(719):警告C4996:'strcpy':此函数或变量可能不安全.请考虑使用strcpy_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.
api.c(2217):警告C4996:'sprintf':此函数或变量可能不安全.请考虑使用sprintf_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.
这些都是历史悠久的问题,每个体面的C程序员都应该知道或理解.请进行谷歌搜索或阅读有关缓冲区溢出的内容以及为何应尽可能避免这些功能.请注意,尽管_s名称是在C1x标准中,但它们在*nix系统上可能并不常见.还有snprintf并且strncpy符合旧标准.
api.c(2892):警告C4312:'type cast':从'ULONG_T'转换为更大尺寸的'HANDLE_T'
不确定是什么HANDLE_T,但在Win32中HANDLE是指针的大小.这很糟糕.我会ULONG_PTR像以前一样建议.
api.c(559):警告C4702:无法访问的代码
究竟是什么意思.
stdio.h(234):看'fopen'的声明
你看见了吗?
api.c(2217):警告C4996:'sprintf':此函数或变量可能不安全.请考虑使用sprintf_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.
与上面类似.
prm.c(681):警告C4996:'fopen':此函数或变量可能不安全.考虑使用fopen_s代替.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.C:\ Program Files(x86)\ Microsoft Visual Studio 10.0\VC\INCLUDE\stdio.h(234):参见'fopen'的声明
这是MS编译器开始推荐的另一个C11功能.这个有点可疑. fopen可能没关系.根据需要阅读文档.
host.c(410):警告C4311:'type cast':从'PVOID_T'到'unsigned long'的指针截断
使用ULONG_PTR或uintptr_t代替unsigned long.
stub.c(138):警告C4295:'eye':数组太小而不能包含终止空字符
我的猜测是你声明了一个像这样的字符串:
char foo[n] = "blah";
Run Code Online (Sandbox Code Playgroud)
哪个n尺寸太小而不适合弦.只需删除整数即可.
api.c(1216):警告C4057:'function':'LPDWORD'在间接方面与'LONG_T*'略有不同的基类型不同
DWORD并且LONG是不同的类型,并且您正在指向一个并将其用作另一个.这是非法的.(在这种情况下,它不会导致您出现问题,但您应该修复它.)
neto.c(595):警告C4152:非标准扩展,表达式中的函数/数据指针转换
嗯,不知道你是怎么做到的.也许你分配了一个函数指针void *?有几个库需要这个,虽然它在标准上在技术上是非法的.
neto.c(2115):警告C4213:使用非标准扩展:强制转换为l值
我的猜测是你做了这样的事情:
*(char*)foo = bar;
Run Code Online (Sandbox Code Playgroud)
非法.
neto.c(2209):警告C4057:'function':'int*'在间接方面与'LONG*'略有不同的基类型不同
使用PDWORD和LONG互换的类似情况.
td.c(2104):警告C4054:'type cast':从函数指针'FARPROC'到数据指针'PVOID'
与neto.c类似,第595行.
是:
我看到几个会导致未定义的行为.
所有警告都应被视为逻辑错误(至少在您的想法中),应该看一下并保持沉默.通过显式更改代码/通过使用编译器指令使警告静音(然后写一个长评论,为什么你安静警告,这也表明它已被故意查看).
快速扫描我先检查的那些(删除了dupes).
这些肯定听起来不错:
stub.c(138) : warning C4295: 'eye' : array is too small to include a terminating null character
exit1.c(157) : warning C4295: 'publickey' : array is too small to include a terminating null
Run Code Online (Sandbox Code Playgroud)
这些可能很糟糕:
api.c(554) : warning C4310: cast truncates constant value
chp.c(250) : warning C4244: '=' : conversion from 'SOCKET' to 'ULONG_T', possible loss of data
api.c(1216) : warning C4057: 'function' : 'LPDWORD' differs in indirection to slightly different base types from 'LONG_T *'
neto.c(2209) : warning C4057: 'function' : 'int *' differs in indirection to slightly different base types from 'LONG *'
td.c(760) : warning C4244: '=' : conversion from 'uintptr_t' to 'int', possible loss of data
msc.c(287) : warning C4133: 'function' : incompatible types - from 'long *' to 'time_t *'
arb.c(166) : warning C4267: '=' : conversion from 'size_t' to 'LONG_T', possible loss of data
arb.c(226) : warning C4244: '=' : conversion from 'int' to 'CHAR_T', possible loss of data
api.c(665) : warning C4311: 'type cast' : pointer truncation from 'HANDLE_T' to 'LONG'
Run Code Online (Sandbox Code Playgroud)
这些我不会留在代码中,但可能是良性的:
api.c(559) : warning C4702: unreachable code
td.c(2104) : warning C4054: 'type cast' : from function pointer 'FARPROC' to data pointer 'PVOID'
Run Code Online (Sandbox Code Playgroud)