相关疑难解决方法(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变量参数重构

我有一个irc_sendline可以像printfcan 一样调用的函数

irc_sendline(s, "A strange game.\nThe only %s is not to play.", "winning move");
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我对它的实现不满意:

int irc_sendline(irc *iobj, char *msg, ...)
{
   char tmp_msg[BUFSIZE], fmsg[BUFSIZE];
   va_list args;
   int len;

   va_start(args, msg);

   strncpy(tmp_msg, msg, BUFSIZE);
   strncat(tmp_msg, "\r\n", BUFSIZE);

   len = vsnprintf(fmsg, BUFSIZE, tmp_msg, args);
   len = send(iobj->fd, fmsg, len, 0);

   return len;
}
Run Code Online (Sandbox Code Playgroud)

你看,我在这里使用2个"临时"缓冲区,因为我首先必须将原始消息从函数参数复制到临时缓冲区,以便将"\ r \n"附加到它,然后将该临时缓冲区复制到另一个临时缓冲区做函数调用中提供的参数实际的格式化,只有那么我可以在它的途中送东西.

我怎么能让这个更干净,更好?


感谢这里的所有输入,我认为我唯一的问题是那里的混乱,但它实际上是一个滴答作响的定时炸弹!我的新功能如下所示:

int irc_sendline(irc *iobj, char *msg, ...)
{
   char buffer[BUFSIZE];
   va_list args;
   int res_str_len;
   int sent; …
Run Code Online (Sandbox Code Playgroud)

c refactoring function

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

C中的空终止字符串

我很担心 C 中的字符串。我需要设置最后一个字符 \0 还是它自己设置?如果我不手动执行,那么当我尝试调试代码以及​​访问 string1[257] 时它不为空。我在释放字符串数组的分配内存时遇到问题,所以我认为这是一个原因。

char string1[257], string2[257];
scanf("%s", &string2);
string1[257] = '\0';
strncpy(string1, string2, 257);
string1[257] = '\0'; /* do I need to do that? */
Run Code Online (Sandbox Code Playgroud)

c string null

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

错误:将'const char [5]'赋值给'char [10]'时出现不兼容的类型

我把c定义为

char c[][10]
Run Code Online (Sandbox Code Playgroud)

在函数定义中使用它 c[i]="gray";

怎么了?我在网上搜索,它显示相同的语法.

谢谢.

c++ char

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

strncpy并不总是空终止

我使用下面的代码:

char filename[ 255 ];
strncpy( filename, getenv( "HOME" ), 235 );
strncat( filename, "/.config/stationlist.xml", 255 );
Run Code Online (Sandbox Code Playgroud)

收到此消息:

(warning) Dangerous usage of strncat - 3rd parameter is the maximum number of characters to append.
(error) Dangerous usage of 'filename' (strncpy doesn't always null-terminate it).
Run Code Online (Sandbox Code Playgroud)

c strncpy

4
推荐指数
2
解决办法
7577
查看次数

cppcheck-terminateStrncpy

cppcheck 新手。无法弄清楚如何解决此问题(cppcheck 警告)。任何帮助,将不胜感激。

 if (!call_initialized)
 { char id1[16];
   char id1[16];
   char* dummy_char_ptr = inet_ntoa(*((in_addr*)&source_ip));
   std::strncpy(id1, dummy_char_ptr, 16);
   dummy_char_ptr=inet_ntoa(*((in_addr*)&destination_ip));
   std::strncpy(id2, dummy_char_ptr, 16);
   dummy_char_ptr=NULL;
   std::cerr << id1 << " -----> " << id2 << std::endl;
   return 0;
   }
Run Code Online (Sandbox Code Playgroud)

错误(警告) - 调用 strncpy() 后,缓冲区“id2”可能不会以零结尾。

c++ strncpy static-code-analysis cppcheck

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

strncpy没有按预期工作

#include <iostream>
using namespace std 
#include <string.h>
int main(){
    char token[] = "some random string";
    char c[23];  
    strcpy( c, token);
    strncpy(c, token, 5); 
    c[strlen(c)] = '\0';
    cout<<c;
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

我的输出是:some random string.但我希望它是:some.任何人都可以解释为什么它的行为像这样?

c++ string strncpy

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

为什么这个简单的代码没有编译?

我有问题编译以下行:

/*This code compiles with error*/
char HeLev1[6];
HeLev1[]="45.0";
/*but this is OK:*/
char HeLev1[6]="45.0";
Run Code Online (Sandbox Code Playgroud)

c

-4
推荐指数
1
解决办法
118
查看次数