strncpy
的手册页:
char * strncpy(char * dest,const char * src,size_t n);
strcpy()和strncpy()函数返回指向目标字符串dest的指针。
如果strncpy(buff, "something", 9) == 0
?
char buff[100]
是否可能为真?
更新
我也认为它不是很可能,但它是我应该对缓冲区溢出进行的程序的一部分,而这种情况仍然在我实现这一目标的过程中。
答案 0 :(得分:5)
否强>
从事实来看
NULL
's value equals 0
NULL
指针不得指向有效对象。根据C11标准,§6.3.2.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
)而导致未定义行为的唯一方法是s1
为NULL
且n
为零。
答案 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 会发生。