静态分析器的API误用错误

时间:2013-12-08 12:51:46

标签: ios static-analysis literals

我从静态分析器中收到此错误:

这是代码:

  

API滥用(Apple) - 词典不能为零

 - (NSString *)description
{
    return [@{@"filePath": self.filePath,
        @"fileName": self.fileName,
        @"fileAttributes": self.fileAttributes,
        @"creationDate": self.creationDate,
        @"modificationDate": self.modificationDate,
        @"fileSize": @(self.fileSize),
        @"age": @(self.age),
        @"isArchived": @(self.isArchived)} description];
}

任何人都可以说出问题是什么吗?

4 个答案:

答案 0 :(得分:3)

这段代码看起来像是旧版Lumberjack的DDFileLogger.m

如果字典中的项目为nil,则通过插入默认空字符串来消除警告 - > https://github.com/CocoaLumberjack/CocoaLumberjack/pull/127/files

    return [@{@"filePath": (self.filePath ?: @""),
          @"fileName": (self.fileName ?: @""),
          @"fileAttributes": (self.fileAttributes ?: @""),
          @"creationDate": (self.creationDate ?: @""),
          @"modificationDate": (self.modificationDate ?: @""),
          @"fileSize": @(self.fileSize),
          @"age": @(self.age),
          @"isArchived": @(self.isArchived)} description];

答案 1 :(得分:2)

您的任何一个值都保证为nil,或者您的某个值不是对象指针,因为以下代码根本不会产生错误:

- (NSString *)description
{
    return [@{@"filePath": @"",
          @"fileName": @"",
          @"fileAttributes": @"",
          @"creationDate": @"",
          @"modificationDate": @"",
          @"fileSize": @"",
          @"age": @"",
          @"isArchived": @""} description];
}

答案 2 :(得分:1)

这可能是由于我们实施了一个属性的getter:

- (id)myLazyPropery
{
    if (featureDisabled) return nil;

    // ...

    return _myLazyPropery;
}

以下任何一项都会触发API滥用警告:

@{self.myLazyProperty}
@[self.myLazyProperty]
[myMutableArray addObject:self.myLazyProperty]

这可以通过使用接受nil值的方法来解决,例如我们arrayWithObject:

分析器太糟糕了,并没有将吸气剂指向问题的根源。

它也不会与if (self.myProperty){@[self.myLazyProperty]}self.myProperty ? @[self.myProperty] : @[]保持沉默,我认为这是一个错误。

答案 3 :(得分:0)

分析器说你的一个字典项值可能是零。只需检查if(!someValue) {// handle nil here, by adding a null object, empty string, returning, etc. },这将使警告变得安静。