gpt4 book ai didi

c - aligned_alloc 返回分配警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:04 25 4
gpt4 key购买 nike

我正在清理警告并发现以下错误:

warning: assignment makes pointer from integer without a cast buf = aligned_alloc(ALIGN_VALUE,BUF_SZ);

此调用位于函数的最顶部,本质上:

char* buf;
buf = aligned_alloc(ALIGN_VALUE,BUF_SZ);

我的理解是 aligned_alloc 返回一个 void *。如果将返回值从 aligned_alloc 转换为 (char *),我会得到:

warning: cast to pointer from integer of different size [-Wint-to-pointer-ast] buf = (char*)aligned_alloc(ALIGN_VALUE,BUF_SZ);

唯一似乎可以解决的问题是

buf = (char*)(uintptr_t)aligned_alloc(ALIGN_VALUE,BUF_SZ);

我已确保包含 stdlib.h 以避免另一篇文章中提到的隐式声明。我假设转换为 char 指针应该已经解决了这个问题。据我所知,当 void* 和 uintptr_t 等效时,我不明白为什么强制转换为 uintptr_t 会解决它。

下面是文件结构的例子

#include <syslog.h>
#include <linux/fs.h>
#include <linux/hdreg.h>
#include <sys/ioctl.h>
#include <sys/mman.h> // mmap
#include <sys/time.h>
#include <unistd.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <stdio.h>
#include <pthread.h>

void* ax_read_thread(void* arg)
{
fprintf(stderr, "read thread started\n");
ax_priv* priv = (ax_priv*)arg;
char* buf;
uint32_t count = 0;

size_t len, transferred = 0;
buf = (char*)(uintptr_t)aligned_alloc(ALIGN_VALUE,BUF_SZ);

if (buf == NULL){
fprintf(stderr, "Aligned alloc failed\n");
pthread_exit(NULL);
}
while(1){
//do things
}
}

感谢大家的帮助。我现在看到警告是调用编译器时未指示正确版本的结果。

最佳答案

这个答案主要总结了评论线程中的观察和建议,包括我的和其他许多人的,并将它们包装在一些说明性的散文中。

首先,问题的出现是因为当您使用现有工具链构建程序时,以其当前形式,aligned_alloc()函数未明确声明。在没有声明的情况下,编译器推断它的签名:它猜测函数返回 int。 ,并且它的参数类型是通过应用于实际参数类型的默认参数提升获得的。然后,编译器会警告您这些推断(尤其是返回类型)似乎与您实际使用该函数的方式不一致。

假设该函数在您的 C 库中可用,解决方案是确保提供正确的原型(prototype)。您可以手动插入原型(prototype),但您不应该这样做。由于它是一个标准库函数,您应该从适当的 header 中获取它的声明,对于这个函数来说是 stdlib.h .

但是,此特定功能是 C11 中的新功能,显然您使用的 GCC 版本默认为针对早期标准进行编译。 Glibc 通过使用 feature-test macro 保护 C11 中的新功能来部分支持这一点。 , _ISOC11_SOURCE .这是为了保护你:如果你正在构建为早期标准编写的代码,并且该代码恰好提供了与 C11 的新函数之一同名的自己的函数,功能测试系统可以防止你遭受痛苦名称冲突。

如果您确实是在为 C11 编写代码(看起来确实如此),并且如果您的 gcc 版本有支持 C11 的选项(即 -std=c11 和/或 -std=gnu11 ),那么在启用该选项的情况下进行编译是你最好的选择。如果你碰巧有一个提供 aligned_alloc() 的 Glibc 版本但不是支持 C11 模式的编译器版本,那么您可以选择手动确保在包含任何标准头文件之前为编译器定义所需的功能测试宏。您可以通过 #define 来做到这一点在源文件的顶部,或通过编译器的命令行选项(例如 -D_ISOC11_SOURCE=1 )。

Glibc 确实aligned_alloc()至少从 2.17 版开始(但我认为最早从 2.16 版开始)。 GCC 确实至少从 4.8 版开始就有 C11 模式。如果这些组件的版本至少是最新的,那么添加选项 -std=c11 就足够了。 (省略 GNU 扩展)或 -std=gnu11 (支持 GNU 扩展)到你的编译命令:

gcc -std=c11 my_program.c

关于c - aligned_alloc 返回分配警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com