如何找出触发警告的铛静态分析器步骤?

问题描述:

方法如下DDAbstractDatabaseLoggerCocoaLumberjack如何找出触发警告的铛静态分析器步骤?

- (void)createAndStartDeleteTimer 
{ 
    if ((deleteTimer == NULL) && (deleteInterval > 0.0) && (maxAge > 0.0)) 
    { 
     deleteTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue); 

     if (deleteTimer != NULL) { 
      dispatch_source_set_event_handler(deleteTimer, ^{ @autoreleasepool { 

       [self performDelete]; 

      }}); 

      [self updateDeleteTimer]; 

      dispatch_resume(deleteTimer); 
     } 
    } 
} 

- (void)updateDeleteTimer 
{ 
    if ((deleteTimer != NULL) && (deleteInterval > 0.0) && (maxAge > 0.0)) 
    { 
     uint64_t interval = (uint64_t)(deleteInterval * NSEC_PER_SEC); 
     dispatch_time_t startTime; 

     if (lastDeleteTime > 0) 
      startTime = dispatch_time(lastDeleteTime, interval); 
     else 
      startTime = dispatch_time(DISPATCH_TIME_NOW, interval); 

     dispatch_source_set_timer(deleteTimer, startTime, interval, 1.0); 
    } 
} 

触发一个铿锵静态分析仪警告:

CocoaLumberjack/Lumberjack/DDAbstractDatabaseLogger.m:207:13: Null pointer passed as an argument to a 'nonnull' parameter 

的步骤截图: enter image description here

我看着我的生成输出,并发现以下plist:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>clang_version</key> 
<string>Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)</string> 
<key>files</key> 
<array> 
    <string>CocoaLumberjack/Lumberjack/DDAbstractDatabaseLogger.m</string> 
</array> 
<key>diagnostics</key> 
<array> 
    <dict> 
    <key>path</key> 
    <array> 
    <dict> 
    <key>kind</key><string>control</string> 
    <key>edges</key> 
     <array> 
     <dict> 
     <key>start</key> 
     <array> 
      <dict> 
      <key>line</key><integer>194</integer> 
      <key>col</key><integer>2</integer> 
      <key>file</key><integer>0</integer> 
      </dict> 
      <dict> 
      <key>line</key><integer>194</integer> 
      <key>col</key><integer>3</integer> 
      <key>file</key><integer>0</integer> 
      </dict> 
     </array> 
     <key>end</key> 
     <array> 
      <dict> 
      <key>line</key><integer>194</integer> 
      <key>col</key><integer>7</integer> 
      <key>file</key><integer>0</integer> 
      </dict> 
      <dict> 
      <key>line</key><integer>194</integer> 
      <key>col</key><integer>17</integer> 
      <key>file</key><integer>0</integer> 
      </dict> 
     </array> 
     </dict> 
     </array> 
    </dict> 

<!-- Lots of the same style of line, col, file key-values in dicts and arrays --> 

    </array> 
    <key>description</key><string>Null pointer passed as an argument to a &apos;nonnull&apos; parameter</string> 
    <key>category</key><string>API</string> 
    <key>type</key><string>Argument with &apos;nonnull&apos; attribute passed null</string> 
    <key>issue_context_kind</key><string>Objective-C method</string> 
    <key>issue_context</key><string>createAndStartDeleteTimer</string> 
    <key>issue_hash</key><integer>14</integer> 
    <key>location</key> 
    <dict> 
    <key>line</key><integer>207</integer> 
    <key>col</key><integer>13</integer> 
    <key>file</key><integer>0</integer> 
    </dict> 
    </dict> 
</array> 
</dict> 
</plist> 

有什么办法可以获得静态分析器认为会导致空指针传入的抽象值?我无法弄清楚。

+0

这只是我或代码形式的第二'if'是死代码?如果'dateTimer!= null',那么第一个if将不会被执行。 – danypata

+0

我们需要查看updateDeleteTimer的源代码 - 我的猜测是它可能会释放并在该方法中将其取消(受到一堆if语句的影响)。 –

+0

我添加了updateDeleteTimer的源代码 –

也许晚了,但看到的步骤,你可以运行独立的命令行scan-build工具,其使用相同的铿锵静态分析仪,但显示了几步,为什么它会触发警告