分析仪为什么会警告“未初始化的值”?

问题描述:

我得到这个分析仪上下面的代码分析仪为什么会警告“未初始化的值”?

- (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; 
} 
的第二行警告在消息表达式

参数是一个未初始化的值

用少量橙色箭头第二方括号下

我不知道是什么原因导致这种情况我尝试了几件事情,但从来没有这种类型的分析器警告。

如何摆脱此分析仪警告?

+0

“outputBuffer”和“outputLength”在所有情况下都被初始化了吗? – zaph

+0

Hrmm我甚至不知道他们是这个问题。看代码。它们都是在代码中进一步声明的另一种方法。然而,它似乎并不是全球变数。 – HurkNburkS

+1

声明不是初始化。 'int i;'未初始化'int i = 0;'is。明确? –

当你声明

size_t outputLength; 

你不进行初始化。分析仪不知道NewBase64Encode将设置其值,所以它警告您可能会出错。

如果您绝对100%确定该值稍后将被初始化,那么您可以放心地忽略分析器警告,但情况很少如此。例如,NewBase64Encode可能会失败,并且outputLength将导致未初始化,导致未定义的行为。

始终是一个很好的做法来初始化每次声明变量,所以在特定情况下只是做

size_t outputLength = 0; 

分析仪会很乐意和你的代码更安全。

+0

太好了。非常感谢你的明确探索。 – HurkNburkS

+0

'length'不是'initWithBytes:length:encoding'中的输出参数。它是'NewBase64Encode'中的一个输出参数, – Sebastian

+0

@Sebastian,很好,我会修复它。 –

该警告说明了原因:

您使用过的参数之一未初始化。如果明确地将outputBuffer,outputLength设置为某​​个默认值,警告将消失。

+0

我用完整的方法更新了代码。我应该分配一个值直接输出吗? – HurkNburkS

+0

是的,将它设置为0.如果&outputLength正在初始化变量(写入它),编译器无法判断。因此,当你到达NSString初始化器时,它仍然被标记为未初始化。 – thst