ISO C委员会(ISO/IEC JTC1/SC21/WG14)已发布TR 24731-1,正在研究TR 24731-2:
TR 24731-1:C库的扩展第一部分:边界检查接口
WG14正在研究更安全的C库函数.该TR旨在通过添加具有缓冲区长度的额外参数来修改现有程序.最新草案见N1225号文件.理由是在N1173号文件中.这将成为技术报告类型2.
TR 24731-2:C库的扩展 - 第二部分:动态分配功能
WG14正在研究更安全的C库函数.该TR面向使用动态分配而不是缓冲区长度的额外参数的新程序.最新草案见N1337号文件.这将成为技术报告类型2.
说我有以下两个功能:
1
int * foo()
{
int b=8;
int * temp=&b;
return temp;
}
Run Code Online (Sandbox Code Playgroud)
2
int * foo()
{
int b=8;
return &b;
}
Run Code Online (Sandbox Code Playgroud)
我没有得到任何警告第一个(例如函数返回局部变量的地址)但我知道这是非法的,因为b从堆栈中消失,我们留下指向未定义内存的指针.
那么我什么时候需要注意返回临时值的地址?
如您所知,局部静态变量不能在函数外部通过名称访问,而是可以通过指针或对其的引用来访问。因此,以下代码格式正确。
但为什么?我知道这个事实是事实,但没有根据。实际上我想要的是C ++标准的相关摘录。我正在阅读,但最终没有找到证据。有人可以给我摘录或提示找我吗(因为仅在文档中搜索“ static”会导致一百多个匹配)?
#include <iostream>
using namespace std;
class Test {
public:
int * f(int i) const {
static int j;
j += i;
cout << "now j = " << j << "\n";
return &j;
}
int & g(int i) const { //same as above but handle reference
static int k;
k += i;
cout << "now k = " << k << "\n";
return k;
}
};
int main() {
Test t;
int *p = …Run Code Online (Sandbox Code Playgroud) 这是代码,
char *foo()
{
static char s[10] = "abcde";
return s;
}
char *bar()
{
char *c = foo();
return c;
}
int main()
{
printf("%s\n", bar());
}
Run Code Online (Sandbox Code Playgroud)
通常情况下,这是错误的,因为我的确在返回一个局部指针bar,但现在c指向一个static变种返回的foo,这将是正确的,返回一个局部变量c的bar?
我试过,这printf是正确的价值,但我不明白它是如何工作的.我想,当bar()完成时,var c应该消失,这应该是printf打印未定义的东西,对吧?
跟进
char *c是一个局部变量,如果char *c = "abcde";,我认为这一点:c是驻留在函数的堆栈一个局部变量,同时"abcde"是一个常数变种驻留在常量区(堆的一部分吗?),所以当bar()完成,c消失,但"abcde"仍还在堆里,对吗?
以下案例让我更加困惑.据我所知,局部变量不会通过指针或引用返回.例如
char * foo()
{
return "Hello world";
}
int* fooo() {
static int i = 100;
return &i;
}
Run Code Online (Sandbox Code Playgroud)
两种情况都会发生什么?
c ×3
c++ ×2
coding-style ×1
pointers ×1
return ×1
return-value ×1
security ×1
static ×1
tr24731 ×1