错误C4703:使用了未初始化的本地指针变量'pNamesPtr'

use*_*413 6 c++

我正在研究一个crypter项目,并在尝试编译程序时遇到以下错误.

main.cpp(520):错误C4703:可能未初始化的本地指针变量'pNamesPtr'使用
==========构建:0成功,1失败,0最新,0跳过==== ======

        DLLNAMES[i].UsedAlready = 0;
    }


    *dwOutSize = (DWORD)pNamesPtr - (DWORD)pBuffer;//*<----is line 520 of error
    *dwImportsSize = *dwOutSize - *dwIATSize;    
    return pBuffer;
}
#pragma pack(1)
typedef struct
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个错误吗?你需要更多的代码才能得到一个好的答案吗?

pas*_*sti 7

此警告并不总是错误,有时它只是优化的结果.因为它在你的代码中并且你不知道它是什么,它实际上可能是一个bug.

例如,如果我写:

int i;

if (this_and_that)
    i = 5;

if (whatever)
    printf("%d\n", i);  // <--- this may give a potential blahblah warning
Run Code Online (Sandbox Code Playgroud)

如果你正在优化那么你可能知道whatever当值为true时值始终this_and_that为true所以如果printf被调用则i已经保证初始化但是编译器通常无法找出this_and_that和之间的关系whatever,这就是你得到的原因警告.对此警告的一种可能的快速修复方法是将变量初始化为您声明它的默认值.在我看来,保留初始化是一种不好的做法,也是很多错误的根源.


Mik*_*our 3

代表着

  • pNamesPtr声明它时没有初始化,因此它以无效值开头;和
  • 编译器无法确定您在使用它之前是否已为其分配了有效值。

检查从声明到使用点的所有代码路径。他们都为变量分配了一些合理的东西吗?如果没有,请修复它,以便他们这样做。

如果他们这样做了,并且您确信您分配的值是正确的,您是否可以简化代码,以便编译器可以清楚地看到它是正确的?

如果所有其他方法都失败,那么您可以通过将编译器初始化为初始化值nullptr或初始化中的其他默认值来使编译器静音。但只有当您确实确定您的代码正确时才这样做 - 编译器通常擅长发现此类错误。