相关疑难解决方法(0)

snprintf()总是null终止?

snprintf是否始终为null终止目标缓冲区?

换句话说,这是否足够:

char dst[10];

snprintf(dst, sizeof (dst), "blah %s", somestr);
Run Code Online (Sandbox Code Playgroud)

或者你必须这样做,如果somestr足够长?

char dst[10];

somestr[sizeof (dst) - 1] = '\0';
snprintf(dst, sizeof (dst) - 1, "blah %s", somestr);
Run Code Online (Sandbox Code Playgroud)

我对标准所说的以及一些流行的libc可能做的不是标准行为感兴趣.

c posix libc

73
推荐指数
4
解决办法
5万
查看次数

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

vsnprintf_s是否已弃用vsnprintf?

在我的代码(严格的C,而不是C++)中,我用这种方式使用vsnprintf:

char* buf = NULL;
size_t sz;
sz = vsnprintf( buf, 0, format, args); // Ask vsnprintf how big a buffer we need

buf = (char*) malloc(sz + 1);
vsnprintf( buf, sz, format, args); // Now actually fill the buffer
/* Use buf in a dialog box... then: */
free(buf);
Run Code Online (Sandbox Code Playgroud)

但MS Visual C++(MSVS10)编译器警告:

warning C4996: 'vsnprintf': This function or variable may be unsafe. Consider using vsnprintf_s instead. 
Run Code Online (Sandbox Code Playgroud)

但是,vsnprintf_s不能有漂亮的功能,当您为缓冲区传递NULL它将描述多少数据它打印.相反,它被记录为返回-1.

我觉得我vsnprintf通过确定必要的尺寸以安全的方式使用,并且建议的更换,vsnprintf_s …

c printf visual-studio-2010

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

标签 统计

c ×3

coding-style ×1

libc ×1

posix ×1

printf ×1

security ×1

tr24731 ×1

visual-studio-2010 ×1