以下C代码是否安全?

时间:2010-03-30 13:31:55

标签: c

#include<cstdio>
#include<stdlib.h>

int main()
{
    char* ptr=NULL;
    printf("%s",ptr);
    return 0;
}

打印(null)作为输出。 以上是示例代码。在实际代码中,我得到char *作为函数的返回,我希望打印字符串进行日志记录。但是,NULL也是该函数的有效返回值,所以我想知道在打印字符串之前是否需要进行空检查?

char* ptr=someFuncion();
// do i need the following if statement?
if(ptr!=NULL)
{
  printf("%s",ptr);
}

我只想确保输出是相同的,即如果ptr = NULL,那么在所有平台和编译器上输出应为(null),并且上述代码(不带if语句)不会在任何C标准兼容平台上崩溃

简而言之,上面的代码(没有if语句)标准是否兼容?

感谢您的帮助和耐心:)

此致

拉​​利

4 个答案:

答案 0 :(得分:21)

  

简而言之,就是上面的代码(没有   if语句)标准兼容吗?

没有。 ISO / IEC 9899:1999(C标准文档)没有声明如果ptr为NULL会发生什么,因此行为是 undefined 。您使用的库非常友好,可以为您提供一些有用的输出(“(null)”),而不是崩溃。

包括对NULL的显式检查。

答案 1 :(得分:7)

你的意思是这样吗?

  char* result = foo ();
  printf ("result is %s\n", (result ? result : "NULL"));

答案 2 :(得分:5)

如果有疑问,您不应该依赖实施细节并执行额外的(ptr != NULL) - 这也是很好的编码实践。

答案 3 :(得分:1)

根据我的经验,通常你会在没有if语句的情况下处于清晰状态,虽然我倾向于避免做你所说的习惯...这已经很长一段时间了,但是IIRC是我以前编写的Sun编译器如果你将一个NULL char *传递给printf(),那么使用会导致部分或全部崩溃,所以包含检查更简单,更安全......我打算投入使用宏的说明-form,但是我发现自从我开始打字以来,我在30秒内被其他3个人击败了它。)