加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否有任何工具可以在c中编译断言的编译时间?

发布时间:2020-12-16 10:16:07 所属栏目:百科 来源:网络整理
导读:我前几天在c中写了一个函数,它发生在我身上,编译器可以做更多的事情来帮助我防范错误.我的代码的基本要素是这样的 – void method(SomeType* p){ assert(p != 0); p-something();} 它被称为这样 SomeType p = NULL;if (SomeCondition){ p = some_real_value;
我前几天在c中写了一个函数,它发生在我身上,编译器可以做更多的事情来帮助我防范错误.我的代码的基本要素是这样的 –

void method(SomeType* p)
{
    assert(p != 0);
    p->something();
}

它被称为这样

SomeType p = NULL;
if (SomeCondition)
{
    p = some_real_value;
}

method(p);

很明显,p在运行时可能为null,因此在调试版本中对方法的断言失败.我的错.

但是,似乎有可能编译器可能在编译时捕获到它并发出警告,说它已检测到它已发现可能违反断言的可能性.

好的,这是一个简单的案例,编译器根据程序的某些流程分析和跟踪每个点的可能变量范围,发现指针在该点可能是NULL是相当简单的.

我知道确定是否会违反许多断言可能太难了,但即使是很少次编译器能够告诉我,我编写的代码可能会违反断言,这将有助于我程序更安全.

我认为它可以帮助处理数组索引中的一个错误,例如在循环中: –

assert(index >= 0 && index < array_size);

我想在许多情况下编译器可以在编译时证明索引变量可能超出这些边界并在编译时发出警告.

我意识到,对于编译器而言,这可能是一项太多的工作,但也许有一些工具可以执行这种分析?我一直无法找到谷歌的任何东西,但我想知道这种类型是否存在?或者是否太难以做得好或许有用?

解决方法

诸如PC-lint的静态分析工具可能能够检测到这些问题.
http://www.gimpel.com/html/pcl.htm

关于你的第一个例子:我的风格是赞助引用而不是指针参数或返回值,除非NULL是可接受的值.这消除了断言参数的需要!= NULL.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读