Sqlite3.c 中的 For-loop 语法错误

Posted

技术标签:

【中文标题】Sqlite3.c 中的 For-loop 语法错误【英文标题】:For-loop Syntax Error in Sqlite3.c 【发布时间】:2011-06-06 14:03:12 【问题描述】:

cppcheck 已确定以下语句在 sqlite3.c 中产生语法错误:

for(i=0; i<db->nDb; i++)

全功能:

SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db)
  int i;
  Btree *p;
  assert( sqlite3_mutex_held(db->mutex) );
  for(i=0; i<db->nDb; i++)
    p = db->aDb[i].pBt;
    if( p && p->sharable )
      assert( p->wantToLock>0 );
      p->wantToLock--;
      if( p->wantToLock==0 )
        unlockBtreeMutex(p);
      
    
  
 

我看不出这是一个语法错误。请解释。这是误报吗?

【问题讨论】:

对我来说看起来不错,显然它确实可以编译 - 我不得不说我一直发现 cppcheck 几乎完全没有价值。 会不会被assert 宏搞糊涂了?只是一个疯狂的猜测。 你可能会发现这个有趣的阅读sqlite.org/faq.html#q17 @mu 太短。好像没有。 【参考方案1】:

看起来像是误报,但我无法使用 Cppcheck 1.48 和 SQLite 3.7.6.3 的 C 源代码重现它。

如果您使用不同的来源或不同的版本,请log it as a bug。

【讨论】:

【参考方案2】:

CppCheck 可能会错误地解析比较表达式。 尝试添加一些空格或括号来帮助, 原文:

i<db->nDb

修改:

i < db->nDb

这只是我的猜测。

【讨论】:

猜得不错,但不正确。 Cppcheck 将该行解析为for ( i@2 = 0 ; i@2 &lt; db@1 . nDb@5 ; i@2 ++ )

以上是关于Sqlite3.c 中的 For-loop 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Kotlin 编译报错 ( Not nullable value required to call an ‘iterator()‘ method on for-loop range )(代码片

迭代(for-loop)毫秒访问过去的值

For-loop中的多个printf作为初始化、条件和更新的一部分

将 Python DataFrame 中的值更改为二进制标志(For-Loop 问题)

.less 批处理中的编译 for-loop 过早地结束批处理脚本

For-loop 不适用于 JavaScript 动画