【问题标题】:C and static Code analysis: Is this safer than memcpy?C和静态代码分析:这比memcpy安全吗?
【发布时间】:2019-03-19 10:51:06
【问题描述】:

以下函数是否比使用 memcpy 更安全? Memcpy 在 Checkmarx 静态代码分析中给出以下“Improper_Null_Termination”错误: at 行中的字符串被 at 剥离其终止空字节。但是,如果我使用以下功能,Checkmarx 没有问题:

void myMemCpy(void *dest, void *src, size_t n) 
{ 
   // Typecast src and dest addresses to (char *) 
   char *csrc = (char *)src; 
   char *cdest = (char *)dest; 

   // Copy contents of src[] to dest[] 
   for (int i=0; i<n; i++) 
       cdest[i] = csrc[i]; 
} 

用这个函数代替memcpy()有什么问题吗?

【问题讨论】:

  • 问题很可能出在使用memcpy的代码中,所以请贴出来。 (克隆著名的库函数以使静态代码分析器静音有点像抛弃警告。)
  • 我看不出这比memcpy 更安全。如果有的话,您正在混淆memcpy,因此您的代码分析器不再识别它并且不会抱怨它的(错误)使用。
  • "Improper_Null_Termination" 对我来说听起来就像您正在尝试复制字符串。你可能想要strdup
  • 没有。 int i 不一定适合 size_t n。所以这段代码甚至有一个潜在的错误。
  • memcpy 不关心这种终止。问题出在使用memcpy 的代码中。也许你有这样的代码:memcpy(dst, src, strlen(src)); 无论如何答案是否定的。

标签: c security static-code-analysis checkmarx


【解决方案1】:

下面的函数比使用 memcpy 更安全吗?

没有。一样的。充其量。

如果有的话,由于代码分析器和编译器知道memcpy() 的作用,因此该代码不太是安全的。

特别是考虑到您传递size_t 然后不正确地使用int 循环计数器的方式:

void myMemCpy(void *dest, void *src, size_t n) 
{ 
   // Typecast src and dest addresses to (char *) 
   char *csrc = (char *)src; 
   char *cdest = (char *)dest; 

   // Copy contents of src[] to dest[] 
   for (int i=0; i<n; i++) 
       cdest[i] = csrc[i]; 
} 

在具有 32 位 int 和 64 位 size_t 的 64 位架构上,如果 n 的值超过 2 gig,那将会非常失败。

【讨论】:

  • 您是否对代码进行了任何更改?如果不是,为什么要在答案中重复?
  • 我不会写“它是一样的。充其量。”正如答案的其余部分所解释的那样,这是不一样的。
  • @4386427 我假设这些其他问题可能是可以解决的,在这种情况下它与memcpy() 相同。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多