标签: tr24731

您是否使用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万
查看次数

为什么我不能使用fopen?

在上一个问题的模型中,我询问了所谓的安全库折旧,我发现自己同样对于为什么fopen()应该被弃用感到困惑.

该函数接受两个C字符串,并返回FILE*ptr,或者在失败时返回NULL.线程安全问题/字符串溢出问题在哪里?或者是别的什么?

提前致谢

c c++ deprecated tr24731

24
推荐指数
3
解决办法
2万
查看次数

scanf和scanf_s之间的区别

所以我想问一下这两者有什么区别.如果有的话.在大学里我接受过教学,我使用的是scanf,但是在我的个人电脑上,视觉工作室一直在发送这个警告.

 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
Run Code Online (Sandbox Code Playgroud)

我必须将所有scanf更改为scanf_s,否则程序将无法构建.(我从2013年开始使用ms visual studio的最新版本)

c scanf tr24731 visual-studio

23
推荐指数
2
解决办法
7万
查看次数

fopen_s如何比fopen更安全?

我正在研究用于Windows平台的遗留代码.当我编译代码时VS2013,它会发出以下警告:

错误C4996:' fopen':此函数或变量可能不安全.考虑fopen_s改用.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详情请参见在线帮助."

它也会给出一个熟悉的警告sprintf.sprintf_s由于缓冲区溢出,我理解比sprintf更安全.

但是如何使fopen_s更安全fopen,因为fopen不接受缓冲区就没有缓冲区溢出的可能性.任何人都可以提供一个fopen不安全的案件,fopen_s是否安全?

c++ windows crt msvcrt tr24731

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

为什么定义了rsize_t?

我发现strncpy_s()VS2013定义

errno_t __cdecl strncpy_s
(
  _Out_writes_z_(_SizeInBytes) char * _Dst, 
  _In_ rsize_t _SizeInBytes, 
  _In_reads_or_z_(_MaxCount) const char * _Src, 
  _In_ rsize_t _MaxCount
);
Run Code Online (Sandbox Code Playgroud)

rsize_t 是:

typedef size_t rsize_t;
Run Code Online (Sandbox Code Playgroud)

我认为这是Visual Studio的一个技巧.但是,我发现此功能在此页面上定义如下

errno_t strncpy_s
(
  char *restrict dest,
  rsize_t destsz,
  const char *restrict src, 
  rsize_t count
); 
Run Code Online (Sandbox Code Playgroud)

为什么rsize_t定义在这里?如果size_t在这里使用怎么办?有什么特殊情况可以使用rsize_t吗?

c++ size-t tr24731

21
推荐指数
2
解决办法
7880
查看次数

sprintf_s未在此范围内声明

我有一个使用的C程序sprintf_s.它在Windows中运行良好,但是当我在Linux中编译我的代码时,它会出现以下错误:

sprintf_s was not declared in this scope.
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该如何解决?

c linux tr24731

20
推荐指数
4
解决办法
3万
查看次数

如何从fopen转到fopen_s

Visual Studio抱怨fopen.我无法找到更改它的正确语法.我有:

FILE *filepoint = (fopen(fileName, "r"));
Run Code Online (Sandbox Code Playgroud)

FILE *filepoint = (fopen_s(&,fileName, "r"));
Run Code Online (Sandbox Code Playgroud)

第一个参数的其余部分是什么?

c c++ windows tr24731 c11

15
推荐指数
1
解决办法
4万
查看次数

错误C4996:'scanf':此函数或变量在c编程中可能不安全

我创建了一个小应用程序,通过使用带参数的用户定义函数来查找最大数量.当我运行它时,它会显示此消息

错误1错误C4996:'scanf':此函数或变量可能不安全.请考虑使用scanf_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.

我该怎么做才能解决这个问题?

这是我的代码

#include<stdio.h>

void findtwonumber(void);
void findthreenumber(void);

int main() {
    int n;
    printf("Fine Maximum of two number\n");
    printf("Fine Maximum of three number\n");

    printf("Choose one:");
    scanf("%d", &n);
    if (n == 1)
    {
        findtwonumber();
    }
    else if (n == 2)
    {
        findthreenumber();
    }
    return 0;
}

void findtwonumber(void)
{
    int a, b, max;
    printf("Enter a:");
    scanf("%d", &a);
    printf("Enter b:");
    scanf("%d", &b);
    if (a>b)
        max = a;
    else
        max = b;
    printf("The max is=%d", max);
}

void findthreenumber(void)
{
    int a, …
Run Code Online (Sandbox Code Playgroud)

c windows tr24731 visual-studio c11

13
推荐指数
3
解决办法
8万
查看次数

在MSVC 2017下缺少C11 strerrorlen_s功能

我正试图在MSVC 2017下找到C11标准中包含的strerrorlen_s功能头.我需要它来为错误消息分配空间.代码如下:strerror_s

auto size = strerrorlen_s(errno) + 1;
char* errorReason = (char*)alloca(size);
strerror_s(errorReason, size, errno);
std::ostringstream oss;
oss << "Cannot open: " << fileName << " Reason: " << errorReason;
throw std::runtime_error(oss.str());
Run Code Online (Sandbox Code Playgroud)

在文档中有以下字样:

与所有边界检查函数一样,如果__STDC_LIB_EXT1__由实现定义并且用户在包含之前定义__STDC_WANT_LIB_EXT1__整数常量1,则仅保证strerror_s和strerrorlen_s可用string.h.

MSVC 2017没有定义__STDC_LIB_EXT1__,似乎__STDC_WANT_LIB_EXT1__在包含之前定义string.h没有效果.虽然strerror_s可以.

  • strerrorlen_s在现有的WindowsMSVC 2017年
  • 如果函数不可用,是否有可能通过其他方式获取错误消息长度?
  • strerror_sWindows下是否是线程安全的,因为在Linux下它似乎不是并且如果需要线程安全必须使用strerror_r,但它在Windows上不可用?

c++ tr24731 visual-studio

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

错误:使用未声明的标识符'errno_t'

这是我死的简单虚拟代码:

#include <errno.h>

int main(void)
{
    errno_t e;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这令人惊讶地引发了这个错误:

main.c:5:5: error: use of undeclared identifier 'errno_t'
    errno_t x;
    ^
Run Code Online (Sandbox Code Playgroud)

我开始遵循这些跟踪:当编译器看到<...>包含时,它将首先查看/usr/include我找到errno.h文件的位置.实际上它除了许可评论之外还有一行,它是:

#include <sys/errno.h>
Run Code Online (Sandbox Code Playgroud)

现在,/usr/include/syserrno.h我发现以下几行:

#include <sys/cdefs.h>

#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
#include <sys/_types/_errno_t.h>
#endif
Run Code Online (Sandbox Code Playgroud)

而在/usr/include/_types_errno_t.h,我发现这一点:

typedef int errno_t;
Run Code Online (Sandbox Code Playgroud)

所以看起来,它就在那里,它是整数类型的别名,也是它的一部分errno.h- 就像它应该的那样.

那为什么不包括在内呢?为什么编译器会引发未声明的标识符错误?

提前致谢!


相关信息:

Compiler:
    Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)`

Compiler flags:
    -std=c11 -I/usr/include/sys -I/usr/local/include
Run Code Online (Sandbox Code Playgroud)

宏变量 …

c errno clang tr24731 c11

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

标签 统计

tr24731 ×10

c ×7

c++ ×5

c11 ×3

visual-studio ×3

windows ×3

clang ×1

coding-style ×1

crt ×1

deprecated ×1

errno ×1

linux ×1

msvcrt ×1

scanf ×1

security ×1

size-t ×1