[问题] 如何正确修正 warning C6011 ?

楼主: chrisdar   2018-07-29 22:18:40
开发平台(Platform): (Ex: Win10, Linux, ...)
Windows 10 or 7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Visual Studio Professional 2017 15.5.7
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无,但是有启动建置时启用程式码分析。
问题(Question):
已经写了 null 指标检查还是无法通过程式码分析,
后来乱试试到一个骗过编译器的方法如方法二,但是还是觉得这样骗很不直觉。
想请问关于这个案例如何正确的解决C6011的改法。
喂入的资料(Input):
无。
预期的正确结果(Expected Output):
编译成功,无警告。
错误结果(Wrong Output):
warning C6011: 正在取值 NULL 指标 'Ptr'。
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
#include <iostream>
static inline void *DummyPointerConvert (void *Ptr)
{
return Ptr;
}
#define WA_C6011(type,pointer) ((type *)(DummyPointerConvert (pointer)))
void Func()
{
for (uint8_t *Ptr = (uint8_t *) ( (long) 0xFE000);
Ptr < (uint8_t *) ( (long) 0x100000);
Ptr += 0x10) {
if ( (Ptr != NULL) && ( (* (uint32_t *) Ptr) == 0)) { // warning C6011
break;
}
if (*WA_C6011(uint32_t, Ptr) == 0) { // OK
break;
}
}
}
int main()
{
return 0;
}
补充说明(Supplement):
无。
作者: eye5002003 (下一夜)   2018-07-29 22:56:00
#pragma warning(disable:6011)要是你相信自己的逻辑对指标转型挺危险的,要注意big/little-endian问题以及memory alignment问题
作者: Sidney0503 (Sidney0503)   2018-07-30 05:19:00
要写C++就不要用C的东西该用nullptr不要用NULL, 指标转型reinterpret_cast最后回答你的问题本身 因为你的写法有读取空标的风险所以会跳warning那行if要拆成巢状两层ifif(Ptr != nullptr){if((*(uint32_t *)Ptr) == 0){指标没指著东西本来就不该读取 只是NULL帮你做了一层保险 不代表这个操作是正确的https://msdn.microsoft.com/en-us/library/2ayc37ac连MSDN都这样写......你确定warning是那一行?你照MSDN的code打会出现warning吗?不会是因为编译时期决定的关系吧 因为你的程式不用run-time就可以知道结果 所以编译时期就看到了
作者: sharkbay (Shark Bay)   2018-07-30 06:33:00
跟 MSDN 写的不同吧 这个有夹循环耶
楼主: chrisdar   2018-07-30 08:36:00
是注解那一行没错, 测了几种不同的循环都有一样的C6011
作者: sarafciel (Cattuz)   2018-07-30 10:09:00
你这个warning真正在警告的东西是那两个直接塞的位置0xFE000跟0x100000,如果真的要这样写而且你也确定这两个位置在你的机器上有效 那你就无视C6011吧如果函数参数可以动 你把那两个address在外面硬转传进去Func 应该可以消这个warning 不过本质上也是骗就是XD

Links booklink

Contact Us: admin [ a t ] ucptt.com