可以strncpy返回0吗?

时间:2015-11-07 17:43:55

标签: c buffer-overflow

strncpy的手册页:

  

char * strncpy(char * dest,const char * src,size_t n);

     

strcpy()和strncpy()函数返回指向目标字符串dest的指针。

如果strncpy(buff, "something", 9) == 0

char buff[100]是否可能为真?

更新

我也认为它不是很可能,但它是我应该对缓冲区溢出进行的程序的一部分,而这种情况仍然在我实现这一目标的过程中。

5 个答案:

答案 0 :(得分:5)

从事实来看

  1. The null pointer constant NULL's value equals 0
  2. NULL指针不得指向有效对象。根据C11标准,§6.3.2.3:

      

    [...]空指针[,]保证比较   不等于指向任何对象或函数的指针。

  3. 并且相应的手册页没有提到dest == NULL的可能性,
    允许。

答案 1 :(得分:4)

想一想。手册页的内容是什么?它说它返回dest。因此,如果dest不是NULL,则返回值将不是NULL

由于buff永远不会是NULL(假设它是char buff[100]),所以你可以肯定地说不,它永远不会返回NULL

如果确实如此,那就是一个错误。

答案 2 :(得分:2)

在我看来,如果执行的代码不包含任何未定义的行为,则给定的代码不能返回NULL

唯一可以返回NULL的情况是目的地是NULL。在这种情况下(最有可能),除非复制的字符数为0,否则执行将是段错误。

在给定的例子中:

strncpy(buff, "something", 9)

目的地都不能是NULL(因为它是char buff[100]),复制的字符数也不能为0,因为它是9。

答案 3 :(得分:1)

根据ISO / IEC 9899:2011标准§7.24.2.4/ c4 strncpy:功能

  

<强>概要

1   #include <string.h>
    char *strncpy(char * restrict s1,
    const char * restrict s2,
    size_t n);
     

说明

     

2 strncpy函数从n指向的数组复制不超过s2个字符(不会复制&gt;跟随空字符的字符)   

指向的数组      

3如果s2指向的数组是一个短于n个字符的字符串,则&gt;空字符将附加到s1指向的数组中的副本,直到   所有人都写过了。

     

<强>返回

     

4 strncpy函数返回s1的值。   s1。如果在重叠的对象之间进行复制,则行为是   未定义。

因此,strncpy返回0(即NULL)而导致未定义行为的唯一方法是s1NULLn为零。

LIVE DEMO

答案 4 :(得分:0)

strncpy()可以返回NULL。只需mmap一个系统上地址为零的可写页面,该系统将NULL定义为指针,其零值为其数值:

#include <sys/mman.h>
#include <stdio.h>
#include <strings.h>

int main( int argc, char **argv )
{
    char *p;
    char *buf = mmap( ( void * ) 0, 4096,
        PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANON, -1, 0 );
    p = strncpy( buf, "string", strlen( "string" ) );
    printf( "p: %p\n", p );
    printf( "NULL: %p\n", NULL );
    return( 0 );
}

是的,这是故意违反了NULL不得指向有效对象的C标准要求,因此它是未定义的行为。

CAN 会发生。