Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Cast qualifier warning on Windows LLVM clang 16 with CMake FetchContent

未关闭
#894 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 12 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
42/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
停滞
技术栈
c, cmake

调研方向

检查 cJSON.c 中 cast_away_const() helper 附近及其周围的诊断 pragma。使用 Windows 上的 LLVM clang 16 重现报告中的 CMake FetchContent 构建,然后验证 cast-qualifier 警告不再导致构建失败,同时现有的 cJSON 行为保持不变。

由索引模型根据 Issue 内容生成。

描述

Hi,

I'm compiling cJSON using CMake FetchContent with LLVM clang 16 on Windows:

> clang.exe --version
clang version 16.0.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\LLVM\bin

This results in a compile warning because it seems to inherit the high warning levels of my parent project:

C:\LLVM\bin\clang.exe -DCJSON_API_VISIBILITY -DCJSON_EXPORT_SYMBOLS -DENABLE_LOCALES  -std=c89 -pedantic -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wundef -Wswitch-default -Wconversion -Wc++-compat -fstack-protector-strong -Wcomma -Wdouble-promotion -Wparentheses -Wunused-macros -Wmissing-variable-declarations -Wused-but-marked-unused -Wswitch-enum -fvisibility=hidden -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -g -Xclang -gcodeview -MD -MT _deps/cjson-build/CMakeFiles/cjson.dir/cJSON.c.obj -MF _deps\cjson-build\CMakeFiles\cjson.dir\cJSON.c.obj.d -o _deps/cjson-build/CMakeFiles/cjson.dir/cJSON.c.obj -c C:/src/project/build/ninja/Debug/_deps/cjson-src/cJSON.c
C:/src/project/build/ninja/Debug/_deps/cjson-src/cJSON.c:2022:19: error: cast from 'const void *' to 'void *' drops const qualifier [-Werror,-Wcast-qual]
    return (void*)string;
                  ^
1 error generated.

I can of course suppress warnings in cJSON from my parent project, so this is a very minor issue, but if you'd like to address it anyway in the cJSON source, then either of the changes in the patch seems to work for me:

diff --git a/cJSON.c b/cJSON.c
index 61483d9..b3e4ac4 100644
--- a/cJSON.c
+++ b/cJSON.c
@@ -2012,14 +2012,12 @@ CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item)

 #if defined(__clang__) || (defined(__GNUC__)  && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
     #pragma GCC diagnostic push
-#endif
-#ifdef __GNUC__
-#pragma GCC diagnostic ignored "-Wcast-qual"
+    #pragma GCC diagnostic ignored "-Wcast-qual"
 #endif
 /* helper function to cast away const */
 static void* cast_away_const(const void* string)
 {
-    return (void*)string;
+    return (void*)(uintptr_t)string;
 }
 #if defined(__clang__) || (defined(__GNUC__)  && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
     #pragma GCC diagnostic pop

Evidently LLVM clang 16 does not define __GNUC__:

> C:\apps\LLVM\bin\clang.exe -dM -E -x c NUL | grep __G
#define __GCC_ASM_FLAG_OUTPUTS__ 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1

So having different #ifdef blocks for the diagnostic sections around the cast_away_const() function isn't having the desired effect in this case, but it seems like it should be safe to combine them, which works since __clang__ is defined.

On the other hand, potentially you could get rid of the preprocessor wrappers around this function and just do an intermediate cast to uintptr_t as demonstrated in the above patch to avoid the cast qualifier warning.

Of course if you don't care to change this at all, that's fine too.

Thanks,
Benbuck

主要语言
C
星标
13k
派生
3.5k
PR 合并指标
30 天内没有已合并 PR

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

DaveGamble/cJSON 的其他 Issue

查看 DaveGamble/cJSON 的全部 Issue

相似的 Issue

更多 C Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。