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 < 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中的多个printf作为初始化、条件和更新的一部分
将 Python DataFrame 中的值更改为二进制标志(For-Loop 问题)