分析仪为什么会警告“未初始化的值”?
我得到这个分析仪上下面的代码分析仪为什么会警告“未初始化的值”?
- (NSString *)base64EncodedString
{
size_t outputLength;
char *outputBuffer =
NewBase64Encode([self bytes], [self length], true, &outputLength);
NSString *result =
[[[NSString alloc]
initWithBytes:outputBuffer
length:outputLength
encoding:NSASCIIStringEncoding]
autorelease];
free(outputBuffer);
return result;
}
的第二行警告在消息表达式
参数是一个未初始化的值
用少量橙色箭头第二方括号下
我不知道是什么原因导致这种情况我尝试了几件事情,但从来没有这种类型的分析器警告。
如何摆脱此分析仪警告?
当你声明
size_t outputLength;
你不进行初始化。分析仪不知道NewBase64Encode
将设置其值,所以它警告您可能会出错。
如果您绝对100%确定该值稍后将被初始化,那么您可以放心地忽略分析器警告,但情况很少如此。例如,NewBase64Encode
可能会失败,并且outputLength
将导致未初始化,导致未定义的行为。
始终是一个很好的做法来初始化每次声明变量,所以在特定情况下只是做
size_t outputLength = 0;
分析仪会很乐意和你的代码更安全。
太好了。非常感谢你的明确探索。 – HurkNburkS
'length'不是'initWithBytes:length:encoding'中的输出参数。它是'NewBase64Encode'中的一个输出参数, – Sebastian
@Sebastian,很好,我会修复它。 –
该警告说明了原因:
您使用过的参数之一未初始化。如果明确地将outputBuffer,outputLength设置为某个默认值,警告将消失。
我用完整的方法更新了代码。我应该分配一个值直接输出吗? – HurkNburkS
是的,将它设置为0.如果&outputLength正在初始化变量(写入它),编译器无法判断。因此,当你到达NSString初始化器时,它仍然被标记为未初始化。 – thst
“outputBuffer”和“outputLength”在所有情况下都被初始化了吗? – zaph
Hrmm我甚至不知道他们是这个问题。看代码。它们都是在代码中进一步声明的另一种方法。然而,它似乎并不是全球变数。 – HurkNburkS
声明不是初始化。 'int i;'未初始化'int i = 0;'is。明确? –