【问题标题】:For-loop Syntax Error in Sqlite3.cSqlite3.c 中的 For-loop 语法错误
【发布时间】: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 太短。好像没有。

标签: c sqlite syntax-error cppcheck


【解决方案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 ++ ) {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2014-05-04
    相关资源
    最近更新 更多