gpt4 book ai didi

c - 如何让 gcc 警告返回局部变量的地址?

转载 作者:太空狗 更新时间:2023-10-29 16:41:23 26 4
gpt4 key购买 nike

使用 gcc 4.4.5,我收到以下代码的警告。

char *f(void)
{
char c;
return &c;
}

但是,当我使用临时指针时,不再有警告(即使行为是错误的)。

char *f(void)
{
char c;
char *p = &c;
return p;
}

我听说在 C 中指针分析很难,但是 gcc 可以警告这样的代码吗?

最佳答案

编译器和大多数静态分析器不会尝试对程序可能做的所有错误发出警告,因为这会导致太多误报(与源代码中的实际问题不对应的警告)。

Macmade推荐Clang在评论中,我可以提出第二个建议。请注意,Clang 的目标仍然是通过最大限度地减少误报对大多数开发人员有用。这意味着它有误报,或者换句话说,它遗漏了一些真正的问题(当不确定是否存在问题时,它可能会保持沉默,而不是冒着因误报而浪费开发人员时间的风险)。


请注意,函数f()是否真的有问题甚至有争议在你的程序中。函数h()下面显然没问题,尽管调用代码不能使用 p返回后:

char *p;

void h(void)
{
char c;
p = &c;
}

我可以推荐的另一个静态分析器是 Frama-C's value analysis (我是开发人员之一)。当在受控条件下使用时,对于某些错误系列(包括悬垂指针),该错误不会留下任何漏报。

char *f(void)
{
char c;
return &c;
}

char *g(void)
{
char c;
char *p = &c;
return p;
}

$ frama-c -val -lib-entry -main g r.c
...
r.c:11:[value] warning: locals {c} escaping the scope of g through \result
...
$ frama-c -val -lib-entry -main f r.c
...
r.c:4:[value] warning: locals {c} escaping the scope of f through \result
...

以上仅供引用,并不代表功能一定有错。我的函数有一个 h()也是:

h.c:7:[value] warning: locals {c} escaping the scope of h through p

真正的错误,以 Frama-C 输出中的“断言”一词为特征,是函数调用了 h()。然后使用 p :

void caller(void)
{
char d;
h();
d = *p;
}

$ frama-c -val -lib-entry -main caller h.c
...
h.c:7:[value] warning: locals {c} escaping the scope of h through p
...
h.c:13:[kernel] warning: accessing left-value p that contains escaping addresses; assert(Ook)
h.c:13:[kernel] warning: completely undefined value in {{ p -> {0} }} (size:<32>).

Frama-C的值(value)分析叫做context-sensitive .解析函数h()对于每次调用,实际传递给它的值。它还会分析调用 h() 之后的代码。在函数中 caller() h() 实际可以返回的值.这比 Clang 或 GCC 通常执行的上下文不敏感分析更昂贵,但更精确。

关于c - 如何让 gcc 警告返回局部变量的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12228731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com