0

我收到警告:忽略 'getcwd' 的返回值,在运行此代码时使用属性 warn_unused_result #define get_current_dirr 声明:

#define get_current_dir getcwd
FILE *open_particle_data()
{
    FILE *data_file;
    char data_file_name[] = "particle_data.txt";
    char buff[FILENAME_MAX];
    get_current_dir(buff, FILENAME_MAX);
    char *output_dir;
    char str1[] = "/output_data/";
    output_dir = malloc(strlen(buff) + strlen(str1) + strlen(data_file_name) + 1);
    strcpy(output_dir, buff);
    strcat(output_dir, str1);
    strcat(output_dir, data_file_name);
    data_file = fopen(output_dir,"w");
    free(output_dir);
    return data_file;

任何帮助,将不胜感激。谢谢

4

2 回答 2

2

Glibc 中的各种函数的注释方式向编译器暗示它们的返回值被忽略是可疑的。当 GCC 在编译期间观察到此类函数的返回值确实被忽略时,它(默认情况下)会发出警告。这就是你所看到的。

C 语言允许您忽略函数返回值,但这样做通常是错误的。特别是,许多函数的返回值包含有关函数成功或失败的信息,忽略失败的可能性会导致错误的,甚至可能是破坏性的行为。而且这可能要到以后才会显现出来,从而使此类问题难以调试。

getcwd()特别是当它失败时返回一个空指针,在这种情况下你不能依赖它来将一个有效的字符串写入指定的缓冲区。一个健壮的程序会检测到这样的返回值并优雅地处理它。例如,程序可能会发出诊断消息并在观察getcwd()到失败时终止。

另一方面,如果您只是想消除错误而不实际解决问题,那么您可以将返回值转换void为明确指示 GCC 和其他一些编译器您有意忽略它。我不推荐这个。

于 2022-01-24T15:35:49.110 回答
0

作为对 John Bollinger 响应的扩展,我会说在成功执行和出错的情况getcwd()下返回指向传递缓冲区的指针。NULL您应该使用该返回值,以查看是否getcwd()正确执行,因为某些情况可能会使其失败:

  • 传递的size缓冲区的 为零。
  • 路径名的一个组件不再存在(如果某些访问目录的 paren 目录已被消除,则可能会发生这种情况)
  • 缓冲区大小与实际路径名不符。
  • 在某些目录中直到根目录的读取或执行权限未授予该进程。

最常见的是您提供了一个短缓冲区来存储路径。

于 2022-01-24T21:56:47.227 回答