相关疑难解决方法(0)

您是否使用TR 24731'安全'功能?

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.

问题

  • 您是否使用支持TR24731-1功能的库或编译器?
  • 如果是这样,哪个编译器或库以及哪个平台?
  • 您是否因修复代码以使用这些功能而发现任何错误?
  • 哪些功能提供最大价值?
  • 有没有提供任何价值或负值?
  • 你打算将来使用这个图书馆吗?
  • 您是否正在跟踪TR24731-2的工作?

c security coding-style tr24731

71
推荐指数
5
解决办法
1万
查看次数

C中局部变量的返回地址

说我有以下两个功能:

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 return return-value

12
推荐指数
1
解决办法
2万
查看次数

为什么可以从外部通过指针或引用访问静态本地对象?

如您所知,局部静态变量不能在函数外部通过名称访问,而是可以通过指针或对其的引用来访问。因此,以下代码格式正确。

但为什么?我知道这个事实是事实,但没有根据。实际上我想要的是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)

c++ language-lawyer

8
推荐指数
1
解决办法
164
查看次数

返回一个指向静态变量的本地指针

这是代码,

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,这将是正确的,返回一个局部变量cbar

我试过,这printf是正确的价值,但我不明白它是如何工作的.我想,当bar()完成时,var c应该消失,这应该是printf打印未定义的东西,对吧?

跟进

char *c是一个局部变量,如果char *c = "abcde";,我认为这一点:c是驻留在函数的堆栈一个局部变量,同时"abcde"是一个常数变种驻留在常量区(堆的一部分吗?),所以当bar()完成,c消失,但"abcde"仍还在堆里,对吗?

c static

6
推荐指数
1
解决办法
2312
查看次数

函数返回指针

以下案例让我更加困惑.据我所知,局部变量不会通过指针或引用返回.例如

char * foo()
{
  return "Hello world";
}

int*  fooo() {
    static int i = 100;
    return &i;
}
Run Code Online (Sandbox Code Playgroud)

两种情况都会发生什么?

c++ pointers

1
推荐指数
1
解决办法
122
查看次数